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); 

在这种情况下,第一个Tstring ,第二个T是int。

就像现在一样, Test1Test2没有什么不同。

如果你像这样定义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