自 2011 年以来,我一直是一名 Java 开发人员,通常可以毫无问题地解决这些错误,因为我已经见过很多次了。即使是这个我也见过很多,我通常知道如何解决它。
然而,今天我遇到了一个奇怪的问题,从它的含义来看,我无法理解问题的真正原因。
所以我是一名模组制作者,特别是 Minecraft,在本例中是 Bukkit。然而,这与问题完全无关,因为这与语言本身有关,而不是用它创建的任何库。
所以错误。
Cannot instantiate the type LinqMap<Integer, ? extends ItemStack>
通常当我看到这个时,我认为这是因为我正在尝试使用的类型是一个接口(interface),是抽象的,或者指定的构造函数是私有(private)的或未定义的,但是其中一些确实有自己的错误,但这是我通常检查的内容。
我还注意到在 Stack Overflow 上有很多此错误的副本,但其中大多数似乎指向实例化 List 的方向,它是一个接口(interface),或者一些自定义类是抽象的。如果不是因为我已经检查过这个事实,并且事实证明这不是问题,这将是相同的。
所以我最初尝试使用的这段代码看起来如下
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>();
这仍然以错误告终,这让我很惊讶,因为对象是一个类,它除了是公共(public)的之外没有任何修饰符,而且包括无参数构造函数在内的两个构造函数都是空的。
那么这里有什么问题呢?为什么我不能在代码明确允许的情况下创建 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() {
}
/* ... */
}
最佳答案
在 Java 中,不允许直接实例化通配符类型?
。如果您至少使用 Java 7 进行编译,那么我建议您简单地利用 diamond inference :
Map<Integer, ? extends ItemStack> map = player.getInventory().all(prototype.getType());
HashMap<Integer, ? extends ItemStack> stackmap = new LinqMap<>(map);
关于java - 无法实例化 LinqMap 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48592406/