当你有一个方法时,我明白声明它是通用的是有意义的,这样我就可以采用通用参数。像这样:
public <T> void function(T element) {
// Some code...
}
但是,如果我可以简单地将每个方法都声明为泛型,那么让整个类泛型的想法到底是什么?
好吧,不同之处在于,如果您尝试使类中的每个方法都成为泛型,那么您在说 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中的类
看看 Collection 类。举List<T>
个例子。如果该类没有被声明为泛型,你将如何确保只有正确类的元素可以插入到列表中?你怎么知道你打电话时得到了什么ArrayList.get(i)
?
准确地说,要确保这个类中的所有方法都适用于某种类型。
这通常用于“容器”类。如果您正在构建一个列表,并且将其设为通用,您希望确保添加元素、获取元素、迭代等......始终使用相同的类型。
正如您所提到的,这还允许您使用某种类型的实例变量,并有几种方法以连贯的方式使用该实例(可能返回它,影响它......)。
如果您有一个具有多种不同类型的“泛型”类,则可能表明您确实在一个中编写了两个泛型类......(尽管这可能是合法的事情。)
主要思想是为一个类型绑定类/方法。最好的例子是Generics
编程语言中的概念。它是多态性的实际应用。
泛型类封装了不特定于特定数据类型的操作。泛型类最常见的用途是与链表、哈希表、堆栈、队列、树等集合一起使用,其中从集合中添加和删除项目等操作的执行方式几乎相同,无论数据类型如何存储。
对于大多数需要集合类的场景,推荐的方法是使用编程语言中提供的那些。
参考 oracle文档
泛型类型是泛型类或接口,它在类型上进行参数化
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; }
}
我也建议你看看这个教程