泛型和数组以及Java是如何实现泛型的

Python011

泛型和数组以及Java是如何实现泛型的,第1张

要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance)、逆变性(contravariance)和无关性(invariant)。

若类A是类B的子类,则记作A ≦ B。设有变换f(),若:

当A ≦ B时,有f(A)≦ f(B),则称变换f()具有协变性;

当A ≦ B时,有f(B)≦ f(A),则称变换f()具有逆变性;

如果以上两者皆不成立,则称变换f()具有无关性。

在Java中,数组具有协变性,而泛型具有无关性,示例代码如下:

Object[] array = new String[10]

//编译错误

ArrayList<Object>list=new ArrayList<String>()

这两句代码,数组正常编译通过,而泛型抛出了编译期错误,应用之前提出的概念对代码进行分析,可知:

1、String ≦ Object

2、数组的变换可以表达为f(A)=A[],通过之前的示例,可以得出下推论:

f(String) = String[] 以及 f(Object) = Object[]

4、通过代码验证,String[] ≦ Object[] 是成立的,由此可见,数组具有协变性。

public class DemoFanXing {

public static void main(String[] args) {

Arr<Integer> a = new Arr<Integer>()

a.setArray(1,2,3,4,5,6)

for (int x : a.getArray()) {

System.out.print(x + " ")

}

}

}

class Arr<T> {

private T[] arr

//public <T> void setArray(T...arg),多了一个<T>

public void setArray(T...arg) {

this.arr = arg

}

public T[] getArray() {

return arr

}

}