无法为接口实现者创建通用

时间:2014-08-08 23:22:11

标签: java oop generics map compiler-errors

我正在尝试创建一种服务定位器类,其中有一个

Map<Integer, ? extends ISomething>

但我以后不能这样做

myMap.put(0x00, new SomethingImplementor())

当我得到Error:(18, 33) java: incompatible types: org.sample.SomethingImplementor cannot be converted to capture#1 of ? extends ISomething

我的班级结构如下:

public interface ISomething {
    public void doSomething();
}

public class SomethingImplementor implements ISomething {
    @Override public void doSomething() {...}
}

为什么我无法创建此地图并将值放入其中?

2 个答案:

答案 0 :(得分:3)

你根本不需要通配符。

您可以直接使用

Map<Integer, ISomething>

您可以实现ISomething的每个子类。

无论如何,要在这种情况下使用通配符,您应该使用super。使用extends,您不知道它将是什么类型,因此您无法向地图添加任何内容。

  

List是有界通配符的示例。的?代表一种未知类型,就像我们之前看到的通配符一样。但是,在这种情况下,我们知道这种未知类型实际上是Shape的子类型。 (注意:它可能是Shape本身,或者是某些子类;它不需要字面上扩展Shape。)我们说Shape是通配符的上限。

     

像往常一样,使用通配符的灵活性需要付出代价。这个价格是在方法体中写入形状现在是非法的。例如,这是不允许的:

     

您应该能够弄清楚为什么不允许上面的代码。 shapes.add()的第二个参数的类型是?扩展Shape--一个未知的Shape子类型。由于我们不知道它是什么类型,我们不知道它是否是Rectangle的超类型;它可能是也可能不是这样的超类型,所以在那里传递一个矩形是不安全的。

通配符:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

答案 1 :(得分:0)

请勿使用未知类型?

Map<Integer, ISomething> map;

使用未知类型无法获得任何结果,只需指定ISomething即可,并且是正确的选择。

此外,泛型类型必须完全匹配;即? extends ISomethingISomething

的类型不同