作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的代码中,我想从 Map 中获取一个“?super SomeInterface”,我该如何声明“值”的类型才能做到这一点?
class SomeClass { /* override hashCode & equals appropriately */}
interface SomeInterface<T> { }
interface AnotherInterface { }
class MainClass {
private final Map<SomeClass, ? super SomeInterface<? extends AnotherInterface>> someMap;
private final SomeClass someClass = new SomeClass();
public MainClass() {
someMap = new HashMap<SomeClass, SomeInterface<? extends AnotherInterface>>();
someMap.put(someClass, new SomeInterface<AnotherInterface>(){});
}
private void getValue(SomeClass someClass) {
/*
* I want to get a "? super SomeInterface<? extends AnotherInterface>" from the Map
* how do I declare the type of "value" to enable me to do so
*
*/
Object value = someMap.get(someClass);
}
private
<T extends SomeInterface<? extends AnotherInterface>>
T getValue2(SomeClass someClass) {
T value;
// the code below does not work
// Type mismatch: cannot convert from capture#3-of
// ? super SomeInterface<? extends AnotherInterface> to T
value = someMap.get(someClass);
}
}
提前致谢。
最佳答案
Object
是你唯一可以申报的东西 value
因为,如果你有一个 ? super Anything
它可以是 Anything
的任何父类(super class)一直到对象。因此,您必须将其分配给最通用的类型。
如果您有一个产生 <? super Something>
的通用类型这几乎可以肯定是一个糟糕的设计(我什至不认为该语言支持它)。那是因为你不能对它产生的东西进行任何推论,而且几乎总是一无所获(不过,请参阅下面我就该主题提出的问题)。 “PECS”是一个很好的助记符:“生产:(使用)扩展,消费:(使用) super ”。
关于java - 泛型:实例化类型为 <? super someClass, AnotherClass<?扩展 YetAnotherClass>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6962151/
我是一名优秀的程序员,十分优秀!