JVic Asked:2020-08-15 23:29:09 +0000 UTC2020-08-15 23:29:09 +0000 UTC 2020-08-15 23:29:09 +0000 UTC 为什么多态性不适用于泛型? 772 为了 Comparable<BigDecimal> c = new BigDecimal(""); 一切都很好,但是 List<Comparable<BigDecimal>> l = new ArrayList<BigDecimal>(); 开始抱怨类型不匹配 java 2 个回答 Voted IR42 2020-08-16T00:21:14Z2020-08-16T00:21:14Z ArrayList<T> implements List<T>, IE。为了使多态性起作用,ArrayList 和 List 必须具有相同的类型。对于这种情况,有通用通配符。 List<? extends Comparable<BigDecimal>> l = new ArrayList<BigDecimal>(); Best Answer Arthur Kupriyanov 2020-08-16T20:48:35Z2020-08-16T20:48:35Z “泛型”是不变的。 这是一个例子: List<Integer> ints = Arrays.asList(1,2,3); List<Number> nums = ints; // compile-time error. Проблема обнаружилась на этапе компиляции nums.set(2, 3.14); assert ints.toString().equals("[1, 2, 3.14]"); 如果您采用整数列表,那么它将不是 Number 的子类型或任何其他子类型。它只是它自己的一个子类型。 То есть List <Integer> — это List<Integer> и ничего больше. 编译器将确保声明为 Integer 类对象列表的 ints 变量仅包含 Integer 类对象,不包含其他任何内容。在编译阶段,会进行检查,我们的运行时不会发生任何事情。 使用上面给出的方法似乎很方便,但是泛型的制作方式是,如果代码被编译,那么在运行时应该没有异常。 编译器甚至不允许我们这样做: List<Number> numbers = new ArrayList<Integer>(); 考虑抽象代码(例如): List<Integer> integers = new ArrayList<Integer>(); List list = integers; List<Number> numbers = integers; // error numbers.add(4.5d); Integer i = numbers.get(0); // error Integer i = numbers.get(0); // ClassCastException 错误同时显示在两行上。 在第一个: java:不兼容的类型:java.util.List 无法转换为 java.util.List 这基本上是预期的,但即使它有效,数字表中的类型信息也会被删除(类型擦除)。因此,我们将无法从该集合中获取 Integer,而是会收到ClassCastException。
ArrayList<T> implements List<T>, IE。为了使多态性起作用,ArrayList 和 List 必须具有相同的类型。对于这种情况,有通用通配符。“泛型”是不变的。
这是一个例子:
如果您采用整数列表,那么它将不是 Number 的子类型或任何其他子类型。它只是它自己的一个子类型。
编译器将确保声明为 Integer 类对象列表的 ints 变量仅包含 Integer 类对象,不包含其他任何内容。在编译阶段,会进行检查,我们的运行时不会发生任何事情。
使用上面给出的方法似乎很方便,但是泛型的制作方式是,如果代码被编译,那么在运行时应该没有异常。
编译器甚至不允许我们这样做:
考虑抽象代码(例如):
错误同时显示在两行上。
在第一个:
这基本上是预期的,但即使它有效,数字表中的类型信息也会被删除(类型擦除)。因此,我们将无法从该集合中获取 Integer,而是会收到ClassCastException。