有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有界泛型类型和仅父类型之间的区别是什么?

有谁能解释一下使用以下方法的区别:

<T extends Object> void method(T input){
}

而且

void method(Object input){
}

据我所知,在这两种情况下,我们在运行时都有对象类型。 使用有界泛型的好处是什么


共 (2) 个答案

  1. # 1 楼答案

    你拥有它的方式没有区别

    但是,构造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,与以前一样

  2. # 2 楼答案

    你为什么认为有好处?第一个是第二个的更详细的形式,就像1+1+1+1+1是表达5的更详细的方式