gpt4 book ai didi

java - Java中如何调用通配符类型的泛型方法?

转载 作者:搜寻专家 更新时间:2023-11-01 01:25:41 25 4
gpt4 key购买 nike

我发现我无法调用通配符类型的泛型方法,不明白为什么?

public class GenericsTry2 {

public static class Element {

private Container<? extends Element> container;

public Container<? extends Element> getContainer() {
return container;
}

public void setContainer(Container<? extends Element> container) {
this.container = container;
}

public void doStuff() {
getContainer().doStuff(this); // how to call this?
}
}

public static class SomeSubElement extends Element {
}

public static class SomeSubElement2 extends Element {
}

public static class Container<E extends Element> {

public void doStuff(E element) {
}

}

public static void main(String[] args) {

Container<SomeSubElement2> c = new Container<SomeSubElement2>();

Element e = new SomeSubElement();

c.doStuff((SomeSubElement2) e); // still can do this at compile time this way

}


}

最佳答案

拥有Container<? extends Element>意味着 the Container can only produce Element (s), but cannot consume Element (s) .

原因是? extends Element表示 Element 的整个未知 子类型家族.假设您将容器设置为 Container<SomeSubElement> .然后,传递 this到容器(即使你知道它是 ElementElement 的子类型)也不正确,因为 this可能是也可能不是 SomeSubElement (取决于运行时类型)。

在泛型的世界中,这称为协方差。

为了编译代码(我不保证你确实需要这个),你可以这样做(注意我已经将容器更改为 Element (s) 的消费者,而不是生产者) :

public class Element {

private Container<? super Element> container;

public Container<? super Element> getContainer() {
return container;
}

public void setContainer(Container<? super Element> container) {
this.container = container;
}

public void doStuff() {
getContainer().doStuff(this);
}
}

但是,如果您需要 Container要同时成为生产者和消费者,只需去掉通配符并将其参数化为 <Element>仅。

关于java - Java中如何调用通配符类型的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31747028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com