我有一个randomizedwrapper类。此类包含接受列表的构造函数:
public class RandomizedWrapper{
final int upperBound = 100;
final List<RandomizerEntry<?>> randomizeList;
Map<Integer, RandomizerEntry<?>> randomizerMap;
/**
* Construct a new RandomizedWrapper instance
*
* @param randomizeList - A list containing all randomizable objects
*/
public RandomizedWrapper(final List<RandomizerEntry<?>> randomizeList) {
this.randomizeList = randomizeList;
this.randomizerMap = new HashMap<>();
}
}
我想创建这个randomizedwrapper类的一个新示例。我通过以下代码执行:
List<RandomizerEntry<ItemStack>> randomizerList = new ArrayList<>();
//stuff here
RandomizedWrapper wrapper = new RandomizedWrapper(randomizerList);//error
尝试创建此新对象时,遇到以下错误:
The constructor RandomizedWrapper(List<RandomizerEntry<ItemStack>>) is undefined
这毫无意义。我很清楚randomizedwrapper类中有一个构造函数,它接受 List<RandomizerEntry<?>>
通配符。编译器提出的解决方案是 create a constructor that accepts this argument
". 我点击它,看看会发生什么,它告诉我” This constructor already exists
".
有人知道这是怎么回事吗?为什么我不能示例化这个对象?
2条答案
按热度按时间yv5phkfx1#
? (wildcars)
主要用于泛型代码不需要对类型和RandomizedWrapper
不是需要通配符的类类型。在这种情况下,最好使用类型参数<T>
(两者之间的区别是什么(通配符)和类型参数(java中)8cdiaqws2#
这里的问题是
List<RandomizerEntry<ItemStack>>
不是的子类型List<RandomizerEntry<?>>
所以你的构造函数不适用于你的论点。请参阅java教程的这一部分,它专门解决了这个误解。至于ide建议创建另一个构造函数,这是行不通的,因为在java中不可能“重载一个方法,其中每个重载的形式参数类型擦除为相同的原始类型”(details)。
解决这个问题的一种方法是使局部变量的类型与构造函数兼容,尽管这当然会限制您可以使用它: