Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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_Wildcard - Fatal编程技术网

Java中的所有通配符都可以替换为非通配符类型吗?

Java中的所有通配符都可以替换为非通配符类型吗?,java,generics,wildcard,Java,Generics,Wildcard,我找不到任何通配符不能被泛型替换的例子。 例如: public void dummy(List<? extends MyObject> list); public void dummy(列表no,它并不总是可替换的 List<? extends Reader> foo(); List您的示例在用法上存在差异 public <T> List<? extends T> dummy2(List<? extends T> list);

我找不到任何通配符不能被泛型替换的例子。 例如:

 public void dummy(List<? extends MyObject> list);

public void dummy(列表no,它并不总是可替换的

List<? extends Reader> foo();

List您的示例在用法上存在差异

public <T> List<? extends T> dummy2(List<? extends T> list);

public List一个简单的答案是,更深层次的通配符不能被类型变量替换

void foo( List<List<?>> arg )

在这里,foo()被一个协变返回类型覆盖,因为
List
List的一个子类型。我忘记了!无论如何,我关于的评论保持正确:-)从调用方的角度来看,
foo1()
只能分配给
List@irreputable:第一点是正确的,可以使用foo2代替foo1。但是,它们的实现可能性有很大不同,因为foo1可以选择列表元素的类型。一个千言万语的例子:
List<? extends Reader> foo();
<T> List<T extends Reader> foo();
public <T> List<? extends T> dummy2(List<? extends T> list);
List<? extends Number> l = new ArrayList<Integer>(Arrays.asList(new Integer(1)));
//Valid since the values are guaranteed to be a subtype of Number
Number o = l.get(0);
//Invalid since we don't know that the valuetype of the list is Integer
l.add(new Integer(1));
//Use to remove unliked numbers, thanks to the wildcard 
//it is impossible to add a Number
@Override public void removeNumberCallback(List<? extends Number> list){
    list.remove(13);
}
void foo( List<List<?>> arg )
<T> 
void foo( List<List<T>> arg)
class Base
    List<? extends Number> foo()

class Derived extends Base
    List<Integer> foo()