List是List的子类吗?

        在回答这个问题之前,我们先探究一下另外一个问题:Interger[]数组可以给Number[]数组赋值吗?先看下面这段代码:

public class ArrayErr
{
	public static void main(String[] args)
	{
		// 定义一个Integer数组
		Integer[] ia = new Integer[5];
		// 可以把一个Integer[]数组赋给Number[]变量
		Number[] na = ia;
		// 下面代码编译正常,但运行时会引发ArrayStoreException异常
		// 因为0.5并不是Integer
		na[0] = 0.5;   // ①
	}
}

        上面代码可以编译通过,但运行会报下面错误:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double
 at ArrayErr.main(ArrayErr.java:13)

        这是一种潜在的风险。在Java的早期设计中,允许Interger[]数组赋值给Number[]数组,这一设计理念是存在缺陷的。一门设计优秀的语言,不仅需要提供强大的功能,而且能提供强大的“错误提示”和“出错警告”,这样才能尽量避免开发者犯错。而Java允许Integer[]数组赋值给Number[]显然不是一种安全的设计。

        Java泛型的设计原则是,只要代码在编译时没有出现警告,就不会遇到运行时ClassCastException异常。依据这一设计原则,泛型不认为List是List的子类。下面两行代码证明了这一点。

 

		List iList = new ArrayList<>();
		// 下面代码导致编译错误
		List nList = iList;

        另外我们可以得出更为广义的一个结论:假设Foo是Bar的一个子类型(子类或子接口),那么Foo[]依然是Bar[]的子类型,但G不是G的子类型。  

  

你可能感兴趣的:(java)