Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型中的错误_Java_Generics - Fatal编程技术网

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<>();