我正在学习 Java 泛型:https://docs.oracle.com/javase/tutorial/java/generics/bounded.html我对下面的代码示例有一些疑问:
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
public <U extends Number> void inspect(U u) {
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
integerBox.set(new Integer(10));
integerBox.inspect("some text"); // error: this is still String!
}
}
为什么inspect()方法不按如下所示编写,而是这样写?
public <T extends Number> void inspect(T t) { }
还有一些其他代码示例具有以下语法。第一对代表什么?
public <K,V> SomeClass<K,V>
静态代表什么?
public static <T> int countGreaterThan(T[] anArray, T elem)
最佳答案
方法Box.inspect()
需要扩展 Number
的类型所以当参数是字符串时它不适用。
Box.inspect()
只是应用于方法的泛型类型的示例。
另一方面,你有一个类Box
具有通用类型 T
,但您也可以有一个接受另一种类型 U
的方法比 T
更宽(上限) .
类本身并没有说明如何使用inspect
为什么,它只是给你处理不同类型的可能性。不要对这个样本抱有太大期望。
考虑到这只是一个解释如何使用泛型的示例(背后没有很好的逻辑)。
关于public class SomeClass<K,V>
声明,这是一个具有多个泛型类型的声明。
类(class) HashMap<K,V>()
是本案例的真实样本,K
是键值的类型,V
是值的类型。
关于Java泛型理解Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44365985/