0

我尝试了下面的行:

HashMap <Temp,<? extends Action> > p= new HashMap<Temp,  <? extends Action>>()

Eclispe 给了我一个错误

此行有多个标记 - 标记“,”上的语法错误,此标记之后的预期类型 - 标记“,”上的语法错误,此标记之后的预期类型

我收到此错误的任何原因以及如何删除此错误?

4

3 回答 3

4

拥有这个:

HashMap <Temp, ? extends Action > p= new HashMap<Temp,  *>();

您需要两种类型的地图。键的类型和值的类型。您不能用<&包围第二种(值)类型,>因为它是不允许的。

我还建议对接口进行编程,注意声明的类型是接口:

Map<Temp, ? extends Action > p = new HashMap<Temp, ? extends Action>();

编辑

正如所指出的,您不能使用通配符泛型类型实例化变量。请将 * 更改为您需要的类型。

于 2012-08-13T22:06:55.697 回答
2

这将编译:

Map<Temp, ? extends Action> p = new HashMap<Temp, Action>();

或者使用 Java 7:

Map<Temp, ? extends Action> p = new HashMap<>();

您在值类型参数中有额外的<>,导致语法错误。除此之外,您不能使用通配符作为类型参数来实例化泛型类型

您还会注意到我将变量更改为Map而不是-对接口HashMap而不是实现进行编程是一种很好的做法,就像winged 的​​回答提到的那样。

于 2012-08-14T01:05:25.413 回答
-4

程序接口!

Map<Temp, ? extends Action> p = new HashMap<Temp, ? extends Action>();

它的更好的做法。

我注意到这可能没有正确回答。问题在这里详细解释。对你有用的也许是

Map<Temp, ? super Action> p = new HashMap<Temp, Action>();

希望有帮助。

第三次编辑,我是新来写评论的,所以请注意确定这个过程是什么,这里是一个例子:

public void doSomething ()
{
    Map<A, ? super A> p = new HashMap<A, A>();

    A a1 = new A();
    A a2 = new A();

    // AS A CONSUMER
    // Not a problem because at runtime we'll know we can accept A.
    p.put(a1, new B());
    p.put(a2, new C());

    // AS A PRODUCER
    // what do I cast to? No way of knowing if its B or C.
    for (Object a : p.values())
    {
    }

    // Same deal as above is it B or C?
    p.get(a1);
}

class A{}

class B extends A {}

class C extends B {}
于 2012-08-13T22:11:51.513 回答