当你有一个方法时,我明白将它声明为通用是有意义的,这样我就可以使用泛型参数。像这样:
public <T> void function(T element) {
// Some code...
}
但是,如果我可以简单地声明每个方法都是通用的,那么究竟是什么让整个类变得通用呢?
答案 0 :(得分:6)
嗯,不同的是,如果你试图让你的类中的每个方法都是通用的,你在firstGenericMethod中使用的泛型类型可能是也可能不是同一类型。我的意思是。
public <T> void firstGenMethod(...){
}
public <T> 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
在上述情况下,没有任何一个方法具有相同的泛型类型。这取决于你如何调用它们。如果您使该类具有通用性,则该类型将应用于该类中的所有方法。
class Test<T>{
public void firstGenMethod(T t){
}
public void secondGenMethod(T t){
}
}
<强>测试强>
Test<String> testingString = new Test<>();
testingString.firstGenMethod("abc");
testingString.firstGenMethod(123);// invalid as your Test class only expects String in this case
您通常会将您的类设为通用的,您希望该类的整个行为(方法)在同一类型上进行处理。最好的例子是 Java Collection Framework
中的类答案 1 :(得分:4)
查看Collection类。以List<T>
为例。如果该类未被声明为泛型,您如何确保只能将正确类的元素插入到列表中?你怎么知道在致电ArrayList.get(i)
时会得到什么?
答案 2 :(得分:2)
准确地说,这个类中的所有方法都适用于某种类型。
这通常用于“容器”类。如果你正在构建一个List,并且你使它成为通用的,你想要确保添加元素,获取元素,迭代等等......总是使用相同的类型。
正如您所提到的,这也允许您使用某种类型的实例变量,并且有几种方法以连贯的方式使用此实例(可能返回它,影响它......)。
如果你有一个具有几种不同类型的“通用”类,它可能表明你真的在一个中写了两个通用类......(虽然这可能是合法的。)
答案 3 :(得分:1)
主要思想是为类型绑定类/方法。最好的例子是编程语言中Generics
的概念。它是多态的真正应用
通用类封装了不特定于特定数据类型的操作。泛型类的最常见用途是使用链接列表,散列表,堆栈,队列,树等集合,其中无论数据类型如何,在集合中添加和删除项目等操作的执行方式大致相同。存储
对于需要收集类的大多数场景,推荐的方法是使用编程语言中提供的方法
受到oracle docs的影响
泛型类型是通过类型参数化的通用类或接口
public class Box {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
一般来说,你可以严格要求
public class Box<T> {
// T stands for "Type"
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
我还建议你看看tutorial