Java泛型中的错误
我试过下面这句话:Java泛型中的错误,java,generics,Java,Generics,我试过下面这句话: HashMap <Temp,<? extends Action> > p= new HashMap<Temp, <? extends Action>>() HashMap拥有以下功能: HashMap <Temp, ? extends Action > p= new HashMap<Temp, *>(); 编辑 如前所述,不能用通配符泛型类型实例化变量。请将*更改为您需要的类型。程序到接口 Map
HashMap <Temp,<? extends Action> > p= new HashMap<Temp, <? extends Action>>()
HashMap拥有以下功能:
HashMap <Temp, ? extends Action > p= new HashMap<Temp, *>();
编辑
如前所述,不能用通配符泛型类型实例化变量。请将*更改为您需要的类型。程序到接口
Map<Temp, ? extends Action> p = new HashMap<Temp, ? extends Action>();
Map p=newhashmap();
这是更好的做法
我注意到这可能没有得到正确的回答。详细解释了这个问题。对你有用的可能是
Map<Temp, ? super Action> p = new HashMap<Temp, Action>();
Map p=newhashmap();
希望有帮助
第三次编辑,我对写评论还不熟悉,所以请注意确定过程是什么,这里是一个示例:
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 {}
public void doSomething()
{
Map p=新的HashMap();
a1=新的A();
a2=新的A();
//作为消费者
//这不是问题,因为在运行时我们知道可以接受。
p、 放置(a1,新的B());
p、 put(a2,新C());
//作为制片人
//我该投什么?不知道是B还是C。
对于(对象a:p.values())
{
}
//和上面一样的交易是B还是C?
p、 get(a1);
}
A类{}
类B扩展了{}
类C扩展了B{}
这将编译:
Map<Temp, ? extends Action> p = new HashMap<Temp, Action>();
Map p=newhashmap();
或使用Java 7:
Map<Temp, ? extends Action> p = new HashMap<>();
Map p=newhashmap();
值类型参数中有额外的
,导致语法错误。过了那一天
您还将注意到,我将变量改为
Map
,而不是HashMap
——这是一种很好的做法,可以代替前面提到的实现。请重新格式化。它显示不正确。请不要在周围使用
?扩展操作
…您将更接近正确。错误不在Java泛型中。无法使用通配符参数实例化类型。无法使用通配符参数实例化类型。为什么?超级动作
?这和OP试图分配给的变量不一样吗?它基本上取决于你想对地图做什么。如果您想向其中添加项目(列表是生产者),那么在运行时,我想我们对PEC的看法是一致的。但实际上,OP为什么要使用通配符呢?这个问题太晦涩了,除了语法错误之外,什么都回答不了。无论如何+1用于更正并添加到您的答案中。不幸的是,你被否决票困住了。是的,你可能需要更多地了解上下文,才能真正理解这里是否需要通配符。
Map<Temp, ? extends Action> p = new HashMap<>();