java中重写列表结果类型

java中重写列表结果类型,java,generics,list,overriding,Java,Generics,List,Overriding,我想用java编译这段代码的一些变体 class X { List<X> getvalue(){...}; } class Y extends X { List<Y> getvalue(){...}; } X类 { 列出getvalue(){…}; } 类Y扩展X { 列出getvalue(){…}; } Javac(1.6)返回一个错误,因为List和List不兼容 关键是我希望编译器 认识到列表是兼容的返回 如果Y是X的子类型,则键入以列出。 我

我想用java编译这段代码的一些变体

class X
{
    List<X> getvalue(){...};
}

class Y extends X
{
    List<Y> getvalue(){...};
}
X类
{
列出getvalue(){…};
}
类Y扩展X
{
列出getvalue(){…};
}
Javac(1.6)返回一个错误,因为List和List不兼容

关键是我希望编译器 认识到列表是兼容的返回 如果Y是X的子类型,则键入以列出。 我希望这样做的原因是为了简化用户定义的工厂类的使用

注意:这个问题有点像
但是对于java。

不,它不是兼容的类型。不能从
List
转换为
List
,因为
Y
X
的子类。考虑:

List<Banana> bananas = new ArrayList<Banana>();
List<Fruit> fruit = bananas;
fruit.add(new Apple());
Banana banana = fruit.get(0); // But it's an apple!
List=newarraylist();
列出水果=香蕉;
添加(新苹果());
香蕉=水果。获取(0);//但它是一个苹果!
您可以在Java中使用有界通配符来表示有限的方差,给出一些有效的值:


List在Java中,重写方法的返回类型必须与被重写方法的返回类型一致


java.util.List
不是协变的(事实上,没有java类是协变的。这是因为缺少声明站点方差注释)。换句话说,
B请格式化代码,使其可读。阅读并可能为他修复:)我试了四次。。。对于需要理解java泛型如何工作的人,建议使用LOL。“java中使用方差”的句子似乎不正确(如果你考虑方差的定义)。也许您应该说“您可以在Java中使用有界通配符…”。您还可以添加有界通配符,使您可以在使用站点上指定类型参数的协方差/逆变约束。@one-zero-one:有界通配符提供一种形式的方差。。。不过我会澄清一点。@Carlos的链接现在在,这里还有一个更新的教程:
List<? extends Fruit> fruit = bananas;
import java.util.List;

class X {
  List<? extends X> getvalue() { return null; }
}

class Y extends X {
  List<Y> getvalue() { return null; }
}