Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有界泛型类型和仅父类型之间有什么区别?_Java_Generics - Fatal编程技术网

Java 有界泛型类型和仅父类型之间有什么区别?

Java 有界泛型类型和仅父类型之间有什么区别?,java,generics,Java,Generics,有谁能解释一下使用以下方法的区别: <T extends Object> void method(T input){ } 据我所知,在这两种情况下,我们在运行时都有对象类型。 使用有界泛型有什么好处?为什么您认为有好处?第一个是第二个的更详细的形式,比如1+1+1+1+1是表达5的更详细的方式。为什么你认为有好处?第一个是第二个的更详细的形式,就像1+1+1+1+1是一种更详细的表达5的方式。你拥有它的方式没有区别 但是,构造T extends对象用于其他一些特性的上下文中。有时,

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

<T extends Object> void method(T input){
}
据我所知,在这两种情况下,我们在运行时都有对象类型。
使用有界泛型有什么好处?

为什么您认为有好处?第一个是第二个的更详细的形式,比如1+1+1+1+1是表达5的更详细的方式。

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

你拥有它的方式没有区别

但是,构造T extends对象用于其他一些特性的上下文中。有时,当我重构一些代码时,我被迫使用它。想象一下这种方法是的,我们在生产中的某个时间点有这样的代码:

public static <T> int sizeOfList(T obj) {
    if (obj instanceof List) {
        return ((List) obj).size();
    }

    throw new IllegalArgumentException("only list is supported");
} 

编译时安全性仍然存在,但擦除现在位于第一个绑定:Object上,与以前一样。

使用它的方式没有区别

但是,构造T extends对象用于其他一些特性的上下文中。有时,当我重构一些代码时,我被迫使用它。想象一下这种方法是的,我们在生产中的某个时间点有这样的代码:

public static <T> int sizeOfList(T obj) {
    if (obj instanceof List) {
        return ((List) obj).size();
    }

    throw new IllegalArgumentException("only list is supported");
} 

编译时安全性仍然存在,但擦除现在处于第一个界限:Object,与以前一样。

我认为在您的情况下没有什么不同。如果在其他地方使用T,就会有一些东西,但实际上它是等价的。可能有一些非常微妙的语言差异,但我不知道它们是什么。在每一个实际和重要的方面,这都是完全一样的。我要补充的是,使用第二个声明会更好。它不那么复杂,并且做同样的事情,所以通过KISS更好。methodObject输入也是如此,它在运行时也被捕获为一个整数。我说的是真的:它们是一样的。哎呀,仅仅因为方法返回类型是void。。。然而,一个好的编码风格会建议使用前者。我认为在你的情况下没有什么不同。如果在其他地方使用T,就会有一些东西,但实际上它是等价的。可能有一些非常微妙的语言差异,但我不知道它们是什么。在每一个实际和重要的方面,这都是完全一样的。我要补充的是,使用第二个声明会更好。它不那么复杂,并且做同样的事情,所以通过KISS更好。methodObject输入也是如此,它在运行时也被捕获为一个整数。我说的是真的:它们是一样的。哎呀,仅仅因为方法返回类型是void。。。然而,一个好的编码风格会建议使用前者,相反,提供了publicstatic@dbl right,List作为一个例子来匹配内部instanceof。正如你在答案中所看到的,虽然非常罕见,但使用?扩展对象&。。。是有意义的。>,因为任何类型在默认情况下都不会扩展对象。事实上替换同一示例中的对象。@dbl上面的示例的删除内容是什么?1 Object&List,2 List取而代之的是public static@dbl right,List只是作为一个示例提供的,以匹配您的内部实例。正如你在答案中所看到的,虽然非常罕见,但使用?扩展对象&。。。是有意义的。>,因为任何类型在默认情况下都不会扩展对象。事实上替换同一示例中的对象。@dbl对上面示例的擦除是什么?1个对象&列表,2个列表
public static <T extends List<?>> int sizeOfList(T obj) {
    return obj.size();
}
public static <T extends Object & List<?>> int sizeOfList(T obj) {
    return obj.size();
}