自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() {
}
/* ... */
}
答案 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);