标签:
这一章节我们继续类型擦除的话题,我们将通过对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
1.数组
package com.ray.ch13;
public class Test {
public static void main(String[] args) {
Fruit[] fruits = new Apple[5];
fruits[0] = new Apple();
fruits[1] = new Fuji();
fruits[2] = new Fruit();
}
}
class Fruit {
}
class Apple extends Fruit {
}
class Fuji extends Apple {
}2.泛型容器
一般用法:
package com.ray.ch13;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Fruit> fruits = new ArrayList<Fruit>();
fruits.add(new Fruit());
fruits.add(new Apple());
fruits.add(new Fuji());
}
}
class Fruit {
}
class Apple extends Fruit {
}
class Fuji extends Apple {
}但是,我们下面将根据向上转型的特性,看看能不能像数组一样?
例子:
package com.ray.ch13;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
// ArrayList<Fruit> fruits = new ArrayList<Apple>();//error
ArrayList<? extends Fruit> fruits = new ArrayList<Apple>();
// fruits.add(new Apple());//error
// fruits.add(new Fruit());//error
fruits.add(null);// 这里只能是null,没有其他选择
}
}
class Fruit {
}
class Apple extends Fruit {
}
class Fuji extends Apple {
}总的来说,因为数组是完全定义,在编译器和运行期都会进行类型检测,或者说数组本身就是持有对象,而泛型容器只是在编译器检查类型安全,而在运行期全是Object,只是半定义,或者说泛型容器不持有对象,才导致上面所展示的问题。
总结:这一章节我们主要对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题。
这一章节就到这里,谢谢。
-----------------------------------
从头认识java-13.11 对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
标签:
原文地址:http://blog.csdn.net/raylee2007/article/details/50369960