我尝试了下面的行:
HashMap <Temp,<? extends Action> > p= new HashMap<Temp, <? extends Action>>()
Eclispe 给了我一个错误
此行有多个标记 - 标记“,”上的语法错误,此标记之后的预期类型 - 标记“,”上的语法错误,此标记之后的预期类型
我收到此错误的任何原因以及如何删除此错误?
拥有这个:
HashMap <Temp, ? extends Action > p= new HashMap<Temp, *>();
您需要两种类型的地图。键的类型和值的类型。您不能用<
&包围第二种(值)类型,>
因为它是不允许的。
我还建议对接口进行编程,注意声明的类型是接口:
Map<Temp, ? extends Action > p = new HashMap<Temp, ? extends Action>();
编辑
正如所指出的,您不能使用通配符泛型类型实例化变量。请将 * 更改为您需要的类型。
这将编译:
Map<Temp, ? extends Action> p = new HashMap<Temp, Action>();
或者使用 Java 7:
Map<Temp, ? extends Action> p = new HashMap<>();
您在值类型参数中有额外的<
和>
,导致语法错误。除此之外,您不能使用通配符作为类型参数来实例化泛型类型。
您还会注意到我将变量更改为Map
而不是-对接口HashMap
而不是实现进行编程是一种很好的做法,就像winged 的回答提到的那样。
程序接口!
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 {}