[英]What is the difference between bounded generic type and just parent type?
任何人都可以解释使用以下方法有什么区别:
<T extends Object> void method(T input){
}
只是
void method(Object input){
}
据我了解 - 在这两种情况下,我们在运行时都有 Object 类型。 使用有界泛型有什么好处?
为什么你认为有好处? 第一个只是第二个更详细的形式,就像 1+1+1+1+1 是表达 5 的更详细的方式。
你拥有它的方式没有区别。
但是,构造T extends Object
用于其他一些“功能”的上下文中。 有时,当我重构一些代码时,我不得不使用它。 想象一下这种方法(是的,我们曾在某个时间点在生产中使用过这样的代码):
public static <T> int sizeOfList(T obj) {
if (obj instanceof List) {
return ((List) obj).size();
}
throw new IllegalArgumentException("only list is supported");
}
这不好。 我可以将运行时检查移至编译时检查,因此您可以天真地执行以下操作:
public static <T extends List<?>> int sizeOfList(T obj) {
return obj.size();
}
不过这里有一个微妙的问题。 第一种方法中T
的擦除是Object
,第二种方法中的擦除是List
。 所以现在相同的调用者(如果他们不重新编译)会遇到一个令人讨厌的惊喜: java.lang.NoSuchMethodError
。
为了摆脱这种情况(以及在我重构后人们讨厌我),我这样做:
public static <T extends Object & List<?>> int sizeOfList(T obj) {
return obj.size();
}
编译时安全仍然存在,但擦除现在在第一个边界: Object
,与以前相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.