无法实例化LinqMap

时间:2018-02-02 23:40:57

标签: java

自2011年以来,我一直是一名Java开发人员,因为我已经看过很多次,因此通常没有任何问题可以解决错误。即便是这个我已经看过很多,我通常知道如何解决它。

然而,今天我遇到了一个奇怪的问题,从它的含义来判断,我无法理解问题究竟是什么。

所以我是一个modder,特别是Minecraft,在这种情况下是Bukkit。然而,这与问题完全无关,因为这与语言本身有关,而不是任何用它制作的库。

所以错误。

  

无法实例化LinqMap< Integer,?扩展ItemStack>

通常当我看到这个时,我认为这是因为我尝试使用的类型是接口,是抽象的,或者指定的构造函数是私有的还是未定义的,但是其中一些确实有自己的错误,但这就是我经常检查的内容。

我还注意到Stack Overflow上有很多这个错误的副本,但是大多数它们似乎指向实例化List的方向,这是一个接口,或者是一些抽象的自定义类。这是相同的,如果不是因为我已经检查了这一点,并且事实并非如此。

所以我最初尝试使用的代码片段如下所示

HashMap<Integer,? extends ItemStack> stackmap = new LinqMap<Integer,? extends ItemStack>(player.getInventory().all(prototype.getType()));

现在,这有点难以发现,所以我试着缩小范围。我注意到了LinqMap的构造函数,它不带任何参数,或者Map<K,V>。 还要指出all返回HashMap<Integer, ? extends ItemStack>,以防你想知道它返回什么。无论如何,所以我再次尝试使用以下代码

Map<Integer,? extends ItemStack> map = player.getInventory().all(prototype.getType());
HashMap<Integer,? extends ItemStack> stackmap = new LinqMap<Integer,? extends ItemStack>(map);

这仍然不起作用,所以我尝试使用空结构,最终像这样

HashMap<Integer,? extends ItemStack> stackmap = new LinqMap<Integer,? extends ItemStack>();

这仍然在错误中结束,这真的让我感到惊讶,因为对象是一个类,除了公共之外它没有修饰符,并且包含无参数的构造函数都是空的。

那么这里的问题是什么?为什么我不能在代码明确允许的情况下创建LinqMap的实例?

另外,这里有一小部分类供参考,它是我定制的,是C#的Linq端口(未发布)

import java.util.HashMap;
import java.util.Map;

public class LinqMap<K,V> extends HashMap<K,V> {

    /**
     * 
     */
    private static final long serialVersionUID = 1796259800183459223L;

    public LinqMap(final Map<K,V> other) {
        for (Map.Entry<K, V> item : other.entrySet()) {
            this.put(item.getKey(), item.getValue());
        }
    }

    public LinqMap() {
    }

    /* ... */

}

1 个答案:

答案 0 :(得分:1)

在Java中,不允许直接实例化通配符类型?。如果您使用至少Java 7进行编译,那么我建议您只使用diamond inference

Map<Integer, ? extends ItemStack> map = player.getInventory().all(prototype.getType());

HashMap<Integer, ? extends ItemStack> stackmap = new LinqMap<>(map);