generics类和generics方法,在下面的示例中将类定义为generics类的原因是什么
这两者之间有什么区别吗? 我定义类型为T的generics类的原因是什么?
如果我只定义方法,那就意味着定义类型T的类。
void Main() { Test1 x = new Test1(); x.Test1Method(1); Test2 x1 = new Test2(); x1.Test2Method(1); } public class Test1 { public void Test1Method(T x) { Console.WriteLine(x); } } public class Test2 { public void Test2Method(T x) { Console.WriteLine(x); } }
它是不一样的,但只有当您具有generics类型的属性/字段(您只能在类本身是通用的时候才能执行)或者您有多个方法时,差异才会明显:
public class ArrayWrapper { private T[] elements; public T get(int index) { return elements[index]; } public void set(int index, T value) { elements[index] = value; } }
如果没有
类,则T[] elements
字段将无法编译,并且可以在同一对象的get()
和set()
使用不同的类型。
(正如李指出的那样,你可能不希望在类上有方法时使用
,因为在两个地方都有它会实际上为方法引入另一个generics类型参数,该参数独立于对于class级…)
在类Test1
,在类级别定义的T
与在Test1Method
方法上定义的T
不同。 这使得class级上的T
无用。
您可以像这样使用Test1
:
Test1 x = new Test1 (); x.Test1Method(1);
在这种情况下,第一个T
是string
,第二个T
是int。
就像现在一样, Test1
与Test2
没有什么不同。
如果你像这样定义Test1
会有所不同:
public class Test1 { public void Test1Method(T x) { Console.WriteLine(x); } }
请注意,在此更改后, Test1Method
没有通用的T
参数。 现在这个类与Test2
不同之处在于,在Test1
您在对象构造时指定T
,而在Test2
,每次调用Test2Method
都可以使用不同的T
以下是如何使用这两个类的示例(在我介绍的更改之后):
Test1 x = new Test1 (); x.Test1Method(1); //valid x.Test1Method(2); //valid x.Test1Method("str"); //invalid Test2 x1 = new Test2(); x1.Test2Method(1); //valid x1.Test2Method("str"); //valid