标签:java generics wildcard covariance
在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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。