繁体   English   中英

了解Java泛型 <T extends Class> 和 <? extends Class>

[英]Understanding Java Generics <T extends Class> and <? extends Class>

这可能是一个愚蠢的问题,所以请原谅我的无知。

可以说我有一堂课:

public class Foo<T extends Base> implements Bar<T> {
    private Bar<T> wrapped;
    public void setWrapped(Bar<T> input) {
        wrapped = input;
    }
}

如果我用以下方式调用它:

//Lets just assume methods getNewVal and getFoo exist
Bar<? extends Base> val = getNewVal();
Foo<? extends Base> foo = getFoo();
foo.setWrapped(val);

编译器说foo.execute(val)是错误。 带有一条消息,类型为Foo <capture#20-of?的方法setWrapped(Bar <capture#20-of?extended Base>)。 extend Base>不适用于参数(Bar <capture#22-of?extended Base>)

如果我尝试将Foo更改为

public class Foo<T extends Base> implements Bar<T> {
    private Bar<T> wrapped;
    public void setWrapped(Bar<? extends Base> input) {
        wrapped = input;
    }
}

foo.setWrapped(val)的调用不再出错。 相反, 包装=输入是错误消息,并带有类型不匹配的消息:无法从Bar <capture#1-of转换? 将Base>扩展到Bar <T>

我究竟做错了什么? 有没有办法让编译器在不进行强制转换的情况下可以通过这样的调用正常运行?

看起来你想要的

public class Foo {
    private Bar<? extends Base> wrapped;
    public void setWrapped(Bar<? extends Base> input) {
        wrapped = input;
    }
}

目前还不清楚是什么Bar接口Foo需要实现的,但是,为什么Foo应该有一个Bar以及 Bar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM