【发布时间】:2015-05-29 05:46:46
【问题描述】:
我有如下界面
public interface Foo<T extends Bar> {
T getBar();
}
还有下面的课
public class FooFinder {
public Foo<? extends Bar> getFoo(final String fooName) {
return knownFoos.get(fooName);
}
private Map<String, Foo<? extends Bar>> knownFoos = new HashMap<>();
}
我的问题是这样的。为什么需要我指定 getFoo 返回 Foo<T extends Bar> 并且 knownFoos 的值是 Foo<T Extends Bar> 而 Foo 因为它的签名而只能是 Foo<T extends Bar>?我可能天真地认为它与类型擦除有关,但我不确定。
附录:
取Foo接口。 T 只能是 Bar 或 Bar 的子类。代码和编译器清楚地说明了这一点。如果我们要尝试以下操作
Foo<T extends Object> fooObj = new Foo<String>();
编译器会告诉你 String 不在绑定 <T extends Bar> 中。所以在编译时,我们知道没有任何Foo 可以不存在于T extends Bar 的范围内。这与 List<T> 示例不同,因为除了扩展 Object 之外,没有绑定到 T,除非您另有指定。
考虑到这一点,如果编译器足够智能,知道Foo 的边界只能是<T extends Bar>,为什么还需要我显式设置边界?
【问题讨论】:
-
您希望指定什么?
-
T在public Foo<T extends Bar> getFoo中来自哪里?我没有看到为类或方法定义的任何类型参数T。 -
@Zymus 此外,
T getBar();不会编译,除非您将其设为abstract。在这一点上,我会要求你停下来并发布一个有效的例子。 -
我错误地将第一个代码块设为
class,而不是预期的interface。我已经更新了问题。