我最近开始学习Java,并且对泛型的使用有疑问。我使用参数和参数上限NumberBox<T extends Number>类,该类仅存储Number对象并进行比较。每当我尝试创建未知列表List<NumberBox<?>>来存储任何NumberBox<T extends Number>对象时,都无法使用非参数方法List<NumberBox<Short>>static addList(List<NumberBox<?>> destinationList, List<NumberBox<?>> sourceList)添加到此未知列表中。但是,我可以使用参数方法<T extends Number> static addListInference(List<NumberBox<?>> destinationList, List<NumberBox<T>> sourceList)将此参数列表添加到未知列表中。任何帮助表示赞赏。谢谢。

import java.util.*;
import java.lang.*;
import java.io.*;

interface Box<T> {
    public T get();
    public void set(T t);
    public int compareTo(Box<T> other);
}

class NumberBox<T extends Number> implements Box<T> {
    T t;
    public NumberBox(T t) {
        set(t);
    }
    @Override
    public T get() {
        return t;
    }
    @Override
    public void set(T t) {
        this.t = t;
    }
    @Override
    public int compareTo(Box<T> other) {
        int result = 0;
            if (t.doubleValue() < other.get().doubleValue()) {
                result = -1;
            } else if (t.doubleValue() > other.get().doubleValue()) {
                result = 1;
            } else if (t.doubleValue() == other.get().doubleValue()) {
                result = 0;
            }
        return result;
    }
}


class MainClass {

    public static <T extends Number>
    void addListInference(List<NumberBox<?>> destinationList, List<NumberBox<T>> sourceList) {
        destinationList.addAll(sourceList);
    }

    public static void addList(List<NumberBox<?>> destinationList,
    List<NumberBox<?>> sourceList) {
        destinationList.addAll(sourceList);
    }

    public static void main (String[] args) throws java.lang.Exception {
        // your code goes here
        List<NumberBox<?>> list = new ArrayList<>();
        List<NumberBox<Short>> shortList = new ArrayList<>();
        shortList.add(new NumberBox<Short>((short) 1));
        // this one fails
        MainClass.addList(list, shortList);
        // this one works
        MainClass.addListInference(list, shortList);
    }
}

最佳答案

问题是

List<NumberBox<?>>


不是...的超类

List<NumberBox<Short>>


因为List<Superclass>List<Subclass>的超类。

您可以使用以下命令使它在没有类型变量T的情况下工作:

List<? extends NumberBox<?>>

关于java - 无法将List <SomeClass <SomeClass >>的边界类型的子代添加到List <SomeClass <?>>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37377399/

10-09 01:40