java - 为什么我不能将 B 父类(super class)的对象放入 Container<? super B>?

标签 java generic-programming

<分区>

我有下面的代码。看来我不能放类 Nonlife 的对象那是类的父类(super class) Vehicle放入 Collection<? super Vehicle> 类型的容器中ALTHOUGH 通配符类型中有一个关键字“super”,并且只有 Vehicle 类的对象和 SUV那是 Vehicle 类的子类是可行的。有人可以给我一些建议吗?

public class SUV extends Vehicle

public class Vehicle extends Nonlife implements Externalizable

public class Nonlife extends Thing

public class Thing implements Comparable<Thing>, Serializable

public class SupperWildcardTest20200830 {
    
    public static void main(String[] args) {
        Collection<Thing> coll = new ArrayList<>();
        appendVehicle2Collection(coll);
        appendSuv2Collection(coll);
        for (Thing el: coll) {
            System.out.println("" + el);
        }
    }
    
    public static void appendVehicle2Collection(Collection<? super Vehicle> coll) {
        coll.add(new Vehicle());
    }
    
    public static void appendSuv2Collection(Collection<? super Vehicle> coll) {
        coll.add(new SUV());
    }
    
    public static void appendNolife2Collection(Collection<? super Vehicle> coll) {
        /**
         * incompatible types: Nonlife cannot be converted to CAP#1
         *  where CAP#1 is a fresh type-variable:
         *    CAP#1 extends Object super: Vehicle from capture of ? super Vehicle
         */
        coll.add(new Nonlife());
    }
}

最佳答案

关于 Collection<? super Vehicle>,您唯一确定的是是它是 Vehicles 的集合,或者是 Vehicles 父类(super class)型的集合。因此,您唯一确定可以放入此集合的是车辆。因此,您可以将 NonLifes 的集合传递给该方法,但您仍然只能将 Vehicles 或子类型放入该方法中的集合中。

一般而言:使用 super,您可以将提到的类型或子类型的值放入其中。使用扩展,您可以从集合中检索提到的类型,或将它们作为父类(super class)型检索。

关于java - 为什么我不能将 B 父类(super class)的对象放入 Container<? super B>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63655638/

相关文章:

java - 你能将枚举类传递给方法吗(java)

java - java中的钻石手链是什么意思泛型包含两种类型List<car<u>>

java - 使用反射修改方法并获得对其局部变量的访问权限

java - Eclipse 进程启动

java - Java实例化map<String, List<String>>的方式

c++ - "expected initializer before ' < ' token"尝试模板成员特化

java - 使用递归将偶数分解为 2,4,6 的和

javascript - javascript和java的按位运算有什么不同

rust - 有什么方法可以递归地展平元组吗?

c++ - 我如何在不知道他有哪些构造函数的情况下初始化属性?