1.泛型的好处
(1)不用进行类型转换,不会出现类型转换异常,提高了代码的安全性;
(2)提高了代码的重用性。
2.说明
泛型具体类型取决于实例化对象时传入的实际类型。
3.使用泛型时注意事项
(1)泛型不能在类中声明静态属性和常量,也就是不能与final、static关键字修饰属性
static修饰的属性是静态常量,先于对象,而泛型取决于实例化对象时传入的实际类型
final修饰属性时必须在声明的同时初始化
(2)泛型不能在类中初始化数组,但是可以声明数组
初始化数组需要给元素分配空间,而泛型不确定所以无法分配空间
public class Test<E>{
public static void main(String[] args) {
Test<Integer> t=new Test<>();
t.es=new Integer[]{5,23,54,4};
t.show(t.es);
}
//可以声明数组
E[] es;
//不能与static一起使用
public void show(E[] es){
for (E e : es) {
System.out.print(e+" ");
}
}
}
(3)在类中不能使用泛型声明的参数个数相同的重载方法
当一个类中有泛型时,创建对象,两个泛型使用相同的数据类型时,重载方法就是一个方法
(4)使用不同实际类型创建出的泛型对象的引用是不可以相互赋值的
4.受限泛型
(1) <?>:表示任意类型
public class Generic<E> {
E e;
public void show(E e){
this.e=e;
}
public E get(){
return e;
}
}
public static void main(String[] args) {
Generic<String> generic=new Generic<>();
generic.show("hello");
print(generic);
Generic<Integer> generic1=new Generic<>();
generic1.show(100);
print(generic1);
}
public static void print(Generic<?> generic){
System.out.println(generic.get());
}
(2) 上限类型 : <? extends T> 表示T类或T类的子类
public class Test {
public static void main(String[] args) {
Generic<Student> generic=new Generic<>();
generic.e=new Student("张三", 20);
generic.show(generic.e);
//调用受限泛型方法
print(generic);
}
//上限类型
public static void print(Generic<? extends Student> generic){
System.out.println("上限泛型:"+generic.e.toString());
}
}
public class Generic <E>{
E e;
public void show(E e){
System.out.println("泛型类:"+e.toString());
}
}
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
(3) 下限类型: <? super T> 表示T类或T类的父类