一般做网站用什么软件,黑龙江省建设信息网,那几家是做失物招领的网站,零食店网站构建策划报告什么是泛型
泛型是一种“代码模板”#xff0c;可以用一套代码套用各种类型。
在讲解什么是泛型之前#xff0c;我们先观察Java标准库提供的ArrayList#xff0c;它可以看作“可变长度”的数组#xff0c;因为用起来比数组更方便。
实际上ArrayList内部就是一个Object[]…什么是泛型
泛型是一种“代码模板”可以用一套代码套用各种类型。
在讲解什么是泛型之前我们先观察Java标准库提供的ArrayList它可以看作“可变长度”的数组因为用起来比数组更方便。
实际上ArrayList内部就是一个Object[]数组配合存储一个当前分配的长度就可以充当“可变数组”
public class ArrayList {private Object[] array;private int size;public void add(Object e) {...}public void remove(int index) {...}public Object get(int index) {...}
}如果用上述ArrayList存储String类型会有这么几个缺点
需要强制转型不方便易出错。
例如代码必须这么写
ArrayList list new ArrayList();
list.add(Hello);
// 获取到Object必须强制转型为String:
String first (String) list.get(0);很容易出现ClassCastException因为容易“误转型”
list.add(new Integer(123));
// ERROR: ClassCastException:
String second (String) list.get(1);要解决上述问题我们可以为String单独编写一种ArrayList
public class StringArrayList {private String[] array;private int size;public void add(String e) {...}public void remove(int index) {...}public String get(int index) {...}
}这样一来存入的必须是String取出的也一定是String不需要强制转型因为编译器会强制检查放入的类型
StringArrayList list new StringArrayList();
list.add(Hello);
String first list.get(0);
// 编译错误: 不允许放入非String类型:
list.add(new Integer(123));问题暂时解决。
然而新的问题是如果要存储Integer还需要为Integer单独编写一种ArrayList
public class IntegerArrayList {private Integer[] array;private int size;public void add(Integer e) {...}public void remove(int index) {...}public Integer get(int index) {...}
}实际上还需要为其他所有class单独编写一种ArrayList
LongArrayList
DoubleArrayList
PersonArrayList
...这是不可能的JDK的class就有上千个而且它还不知道其他人编写的class。
为了解决新的问题我们必须把ArrayList变成一种模板ArrayListT代码如下
public class ArrayListT {private T[] array;private int size;public void add(T e) {...}public void remove(int index) {...}public T get(int index) {...}
}T可以是任何class。这样一来我们就实现了编写一次模版可以创建任意类型的ArrayList
// 创建可以存储String的ArrayList:
ArrayListString strList new ArrayListString();
// 创建可以存储Float的ArrayList:
ArrayListFloat floatList new ArrayListFloat();
// 创建可以存储Person的ArrayList:
ArrayListPerson personList new ArrayListPerson();因此泛型就是定义一种模板例如ArrayList然后在代码中为用到的类创建对应的ArrayList类型
ArrayListString strList new ArrayListString();由编译器针对类型作检查
strList.add(hello); // OK
String s strList.get(0); // OK
strList.add(new Integer(123)); // compile error!
Integer n strList.get(0); // compile error!这样一来既实现了编写一次万能匹配又通过编译器保证了类型安全这就是泛型。
向上转型
在Java标准库中的ArrayListT实现了ListT接口它可以向上转型为ListT
public class ArrayListT implements ListT {...
}ListString list new ArrayListString();即类型ArrayListT可以向上转型为ListT。
要特别注意不能把ArrayListInteger向上转型为ArrayListNumber或ListNumber。
这是为什么呢假设ArrayListInteger可以向上转型为ArrayListNumber观察一下代码
// 创建ArrayListInteger类型
ArrayListInteger integerList new ArrayListInteger();
// 添加一个Integer
integerList.add(new Integer(123));
// “向上转型”为ArrayListNumber
ArrayListNumber numberList integerList;
// 添加一个Float因为Float也是Number
numberList.add(new Float(12.34));
// 从ArrayListInteger获取索引为1的元素即添加的Float
Integer n integerList.get(1); // ClassCastException!我们把一个ArrayListInteger转型为ArrayListNumber类型后这个ArrayListNumber就可以接受Float类型因为Float是Number的子类。但是ArrayListNumber实际上和ArrayListInteger是同一个对象也就是ArrayListInteger类型它不可能接受Float类型 所以在获取Integer的时候将产生ClassCastException。
实际上编译器为了避免这种错误根本就不允许把ArrayListInteger转型为ArrayListNumber。 ArrayListInteger和ArrayListNumber两者完全没有继承关系。
小结
泛型就是编写模板代码来适应任意类型
泛型的好处是使用时不必对类型进行强制转换它通过编译器对类型进行检查
注意泛型的继承关系可以把ArrayListInteger向上转型为ListIntegerT不能变但不能把ArrayListInteger向上转型为ArrayListNumberT不能变成父类。