java通用通配符构造函数不接受对象?

6l7fqoea  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(229)

我有一个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 ".
有人知道这是怎么回事吗?为什么我不能示例化这个对象?

yv5phkfx

yv5phkfx1#

? (wildcars) 主要用于泛型代码不需要对类型和 RandomizedWrapper 不是需要通配符的类类型。在这种情况下,最好使用类型参数 <T> (两者之间的区别是什么(通配符)和类型参数(java中)

public class RandomizedWrapper<T>{

    final int upperBound = 100;
    final List<RandomizerEntry<T>> randomizeList;
    Map<Integer, RandomizerEntry<T>> randomizerMap;

    /**
     * Construct a new RandomizedWrapper instance
     *
     * @param randomizeList - A list containing all randomizable objects
     */
    public RandomizedWrapper(final List<RandomizerEntry<T>> randomizeList) {

        this.randomizeList = randomizeList;
        this.randomizerMap = new HashMap<>();
    }

    public void create(){
        List<RandomizerEntry<Integer>> randomizerList = new ArrayList<>();
        //stuff here
        RandomizedWrapper wrapper = new RandomizedWrapper(randomizerList);//OK
    }
}
8cdiaqws

8cdiaqws2#

这里的问题是 List<RandomizerEntry<ItemStack>> 不是的子类型 List<RandomizerEntry<?>> 所以你的构造函数不适用于你的论点。请参阅java教程的这一部分,它专门解决了这个误解。
至于ide建议创建另一个构造函数,这是行不通的,因为在java中不可能“重载一个方法,其中每个重载的形式参数类型擦除为相同的原始类型”(details)。
解决这个问题的一种方法是使局部变量的类型与构造函数兼容,尽管这当然会限制您可以使用它:

List<RandomizerEntry<?>> randomizerList = new ArrayList<>();

相关问题