编程语言
首页 > 编程语言> > 具有继承和协方差的Java泛型

具有继承和协方差的Java泛型

作者:互联网

Java中使用泛型时,我有点难以理解如何正确使用协方差和通配符.

我试图避免使用铸造.

这是我的情况:

class Element {}

class ChildElement extends Element {}

interface A<T> {
    T doSomething(T foo);
}

interface B extends A<Element> {}

interface C extends B {}

class D implements B {

    @Override
    public Element doSomething(Element foo) {} 
}

class E extends D implements C {
    @Override
    public Element doSomething(Element foo) {}
}

这种情况有效,但我希望能够为E类做到这一点:

class E extends D implements C {

    @Override
    public ChildElement doSomething(ChildEment foo) {}
}

从我所看到的,我想要做的是协方差,但我不能在当前的情况下这样做,因为我需要使用通配符.但我读过你不能对泛型和通配符做协变.

有没有解决这个问题的方法?我想保持每个类之间的强大依赖关系.

谢谢你的帮助 !

解决方法:

你必须使B泛型,但你可以在泛型参数上设置一个绑定,使它至少是一个元素:

interface B<T extends Element> extends A<T> {}

interface C<T extends Element> extends B<T> {}

然后你可以得到的最近的是:

 class D<T extends Element> implements B<T> {
    @Override
    public T doSomething(T foo) { return null;}
}

class E extends D<ChildElement> implements C<ChildElement> {
    @Override
    public ChildElement doSomething(ChildElement foo) { return null;}
}

编译.

标签:java,generics,wildcard,covariance
来源: https://codeday.me/bug/20190830/1765702.html