这一章节我们来简单说一下类型安全的容器。
说到类型安全,不得不说的是泛型,当然,我们在这里只是简单的介绍一下泛型怎么使用,后面的章节会继续展开。
1.怎么才算类型安全?
一个反例:
package com.ray.ch09;
import java.util.ArrayList;
public class Test {
private ArrayList fruitList = new ArrayList();
public void addOrange(Orange orange) {
fruitList.add(orange);
}
public void addApply(Apple apple) {
fruitList.add(apple);
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i < 5; i++) {
test.addApply(new Apple());
}
for (int i = 0; i < 10; i++) {
test.addOrange(new Orange());
}
}
}
class Apple {
}
class Orange {
}
从上面的代码可以看见fruitList里面即装了Orange,也装了Apply,那么当我们需要get出来的时候,我们只是get出来一个Object,这就会遇到一个问题,到达转换成Apply还是Orange,如果转型错误,那么运行时将抛异常。
因此,如果想把代码编程类型安全,那么就需要运用泛型,每一个List限定了放入的对象。
package com.ray.ch09;
import java.util.ArrayList;
public class Test {
private ArrayList<Apple> applyList = new ArrayList<Apple>();
private ArrayList<Orange> orangeList = new ArrayList<Orange>();
public void addOrange(Orange orange) {
orangeList.add(orange);
}
public void addApply(Apple apple) {
applyList.add(apple);
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i < 5; i++) {
test.addApply(new Apple());
}
for (int i = 0; i < 10; i++) {
test.addOrange(new Orange());
}
}
}
class Apple {
}
class Orange {
}
新的代码里面每一个list只能放置特定的对象,所以不会出现类型安全的问题。
而上面所使用的就是泛型,把类型给限定了。这样在运行的时候就不会出现转型异常。
2.对于可以向上转型的对象,如果是继承同一个类或者实现同一个接口,那么也可以放在同一个泛型list里面。
package com.ray.ch09;
import java.util.ArrayList;
public class Test {
private ArrayList<Apple> applyList = new ArrayList<Apple>();
public void addApple(Apple apple) {
applyList.add(apple);
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i < 5; i++) {
test.addApple(new Gala());
test.addApple(new Fuji());
}
}
}
class Apple {
}
class Gala extends Apple {
}
class Fuji extends Apple {
}
package com.ray.ch09;
import java.util.ArrayList;
public class Test {
private ArrayList<CanSwim> swimList = new ArrayList<CanSwim>();
public void add(CanSwim canSwim) {
swimList.add(canSwim);
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i < 5; i++) {
test.add(new Person());
test.add(new Fish());
}
}
}
interface CanSwim {
}
class Person implements CanSwim {
}
class Fish implements CanSwim {
}
总结:这一章节讨论了怎样才是类型安全,然后类型安全的注意点。
这一章节就到这里,谢谢。
-----------------------------------