繁体   English   中英

有界泛型类型和父类型有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM