使类通用的重点是什么?

当你有一个方法时,我明白将它声明为通用是有意义的,这样我就可以使用generics参数。 喜欢这个:

public  void function(T element) { // Some code... } 

但是如果我可以简单地声明每个方法都是通用的,那么究竟是什么让整个类成为通用的呢?

好吧,区别在于如果你试图让你的类中的每个方法都是通用的,那么你在firstGenericMethod中使用的generics类型可能是也可能不是同一类型。我的意思是。

 public  void firstGenMethod(...){ } public  void secondGenMethod(...){ } 

测试:

  SomeClass ref = new SomeClass(); ref.firstGenMethod("string"); ref.secondGenMethod(123);//legal as this generic type is not related to the generic type which is used by firstGenMethod 

在上面的例子中,没有gaurentee两个方法具有相同的generics类型。它取决于你如何调用它们。 如果您使该类具有通用性,则该类型将应用于该类中的所有方法。

 class Test{ public void firstGenMethod(T t){ } public void secondGenMethod(T t){ } } 

测试:

  Test testingString = new Test<>(); testingString.firstGenMethod("abc"); testingString.firstGenMethod(123);// invalid as your Test class only expects String in this case 

您通常会使您的类成为通用的,您希望该类的整个行为(方法)在同一类型上进行处理。 最好的例子是Java Collection Framework中的类

看看Collection类。 以List为例。 如果该类未被声明为generics,您如何确保只能将正确类的元素插入到列表中? 你怎么知道调用ArrayList.get(i)时得到了什么?

确切地说,这个类中的所有方法都适用于某种类型。

这通常用在“容器”类中。 如果你正在构建一个List,并且你使它成为通用的,你想要确保添加元素​​,获取元素,迭代等…总是使用相同的类型。

正如您所提到的,这也允许您使用某种类型的实例变量,并且有几种方法以连贯的方式使用此实例(可能返回它,影响它…)。

如果你有一个具有几种不同类型的“通用”类,那么它可能表明你真的在一个中写了两个通用类……(尽管这可能是合法的。)

主要思想是为类型绑定类/方法。最好的例子是编程语言中的Generics概念。它是多态的真正应用。
通用类封装了不特定于特定数据类型的操作。 generics类的最常见用途是使用链接列表,散列表,堆栈,队列,树等集合,其中诸如添加和删除集合中的项的操作以大致相同的方式执行,而不管数据类型是什么存储。

对于需要集合类的大多数场景,推荐的方法是使用编程语言中提供的方法。
从oracle文档中受到攻击
generics类型是通过类型参数化的generics类或接口

 public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } } 

一般来说,你可以严格要求

 public class Box { // T stands for "Type" private T t; public void set(T t) { this.t = t; } public T get() { return t; } } 

我还建议你看看这个教程