关于列表和数组列表的问题,更具体地说是关于转换的问题

问题描述 投票:0回答:1

为什么前三行无法编译,而其余两行却编译了?这具体是如何工作的?

import java.util.*;
class HelloWorld {
    public static void main(String[] args) {
        //List<Number> ints = new ArrayList<Integer>(); DIDN'T compile
        //List<Integer> nums = new ArrayList<Number>(); DIDN'T compile
        //List<Object>nums = new ArrayList<Integer>();  DIDN'T compile
        //List<? extends Number> nums = new ArrayList<Integer>(); compiled
        //List<? super Number> nums = new  ArrayList<Object>(); compiled
    }
}`
java list arraylist
1个回答
0
投票

前 3 行未编译,因为在 Java 中,不满足泛型类型或协变以确保类型安全,这意味着

List<Intreger>
不算
List<Number>
的子类型。让我们描述给定代码行

不要编译行:

  • List<Number> ints = new ArrayList<Integer>();
    :我们不能将
    List<Integer>
    分配给
    List<Number>
    的变量类型,因为java中的泛型不是协变的。
  • List<Integer> nums = new ArrayList<Number>();
    :与第一个原因相同,我们不能将
    List<Number>
    分配给
    List<Integer>
  • 的变量类型
  • List<Object>nums = new ArrayList<Integer>();
    :与第一个原因相同,我们不能将
    List<Integer>
    分配给
    List<Object>
  • 的变量类型

编译行:

  • List nums = new ArrayList(); :此行有效,因为在此行中您使用带有上限

    ? extends Number
    的通配符。上限通配符允许您接受
    T
    类型的任何子类型。这意味着
    ? extends Number
    接受
    Integer
    Double
    Float

  • List nums = new ArrayList(); :

  • List nums = new ArrayList(); :此行有效,因为在此行中您使用具有下限

    ? extends Number
    的通配符。下限通配符允许您接受类型
    T
    的任何超类型。 这意味着
    ? extends Number
    接受
    Number
    Object

© www.soinside.com 2019 - 2024. All rights reserved.