无法添加List <someclass <child of =“”bounding =“”type =“”for =“”someclass =“”>&gt;到列表<someclass <?>&gt;

时间:2016-05-22 17:28:28

标签: java list generics

我最近开始学习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);
    }
}

1 个答案:

答案 0 :(得分:1)

问题在于

List<NumberBox<?>>

不是

的超类
List<NumberBox<Short>>

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

您可以在没有类型变量T的情况下使用:

使其正常工作
List<? extends NumberBox<?>>