为什么这种泛型返回类型的方法无效

Raf*_*l T 2 java generics interface return-value

我不明白.在java中,我允许将接口声明为方法的返回类型,如:

public List<String> get(){
    return new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)

如果我现在有一个接口可以说IC实现它的类,为什么我不允许这样定义:

public List<I> get(){
    return new ArrayList<C>();
}
Run Code Online (Sandbox Code Playgroud)

我知道创建ArrayList<I>并添加C它的解决方案,但我想知道为什么我不允许像上面那样声明它.我认为每一个C都是一个I虽然应该没问题.

Luk*_*der 10

你不能这样做,因为List<I>List<C>不兼容的类型.

但是,你可以这样做

public List<? extends I> get(){
    return new ArrayList<C>();
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ero 5

你遇到了共同和逆转的问题.简而言之:你的List<I>接口也有一个方法Add,它需要一个实例I,但I实际上并不是每个实例都可以实现C,就像任何其他类也可以实现的那样I.因此,您最终会遇到类型转换问题.