泛型中需要注意的点
- 泛型中可以存放多个参数类型
package zhai.Fx;
// 泛型中可以定义多个参数类型,方便放入多个参数类型进行存放
public class FxDemo4<A,B,C> {
A age;
B name;
C sex;
public void Test(A a,B b,C c){
}
}
- 泛型类的构造器写法不能带泛型参数
public FxDemo4<A,B,C> (){ // 这样编写的构造器是错误的,构造器不支持这种带泛型的写法
错误写法!
}
- 泛型引用类型不同时不可以相互赋值
public void a(){
ArrayList<String> list1 = null;
ArrayList<Integer> list2 = null;
list1 = list2;
}
- 如果定义的反应不指定参数类型,泛型就会被抹掉,并且提供默认类型为Object
public static void main(String[] args) {
// 使用类不指定泛型
FxDemo3 fx1 = new FxDemo3();
fx1.a("zhangsan");
fx1.a(12);
fx1.a(1314.00);
fx1.b(new Integer[]{1,2,3});
// 只要不指定泛型的参数类型,就会默认提供默认参数类型为Object类型
}
- 泛型中的静态方法不能使用类的泛型,注意:在泛型类中不能使用静态方法
public static int b(A a){ // 此时这个参数类型A会报错
// 因为static关键字跟类同时加载,就是还没创建对象就已经加载了,这时候A的类型还没有指定,所以它跟上面的A是不同步的,这时候就会报错。
return a;
}
- 不能直接创建A类型的数组
public void c(A a){
// A[] i = new A[10]; 这样 new 出来的数组是错误的,因为没有指定数组类型
A[] i = (A[])new Object[1]; // 需要强转为A数组类型,其实这个数组类型就是Object
}
泛型方法
什么是泛型方法?
- 并不是方法的参数中带泛型就是泛型方法;
- 而是泛型方法中的参数类型和当前类的泛型参数类型不相同;
- 方法访问修饰符后面加上,才称为放行方法。
package zhai.Fx;
public class FxDemo5<E> {
public void a(E e){
// 不是泛型方法
}
public<T> void b(T e){
// 是泛型方法
}
}
泛型方法的使用:
- 首先泛型方法可以为静态方法,因为它是在调用时才会确定参数类型,所以不牵扯创建对象
- 泛型中不存在继承关系,如:G 和 G A、B不会存在继承关系的,它们是并列的关系
package zhai.Fx;
public class FxDemo5<E> {
public void a(E e){
// 不是泛型方法,不能为静态方法 因为静态方法是跟类一起加载的,它因为没有确定类型就不能使用
}
public static <T> void b(T e){
// 是泛型方法,可以为静态方法
// 因为只有调用时才会指定类型,所以不牵扯创建对象,可以跟类同时加载
}
}
class Demo1{
public static void main(String[] args) {
FxDemo5<String> stringFxDemo5 = new FxDemo5<String>();
stringFxDemo5.a("123123");
stringFxDemo5.b(123);
stringFxDemo5.b("zhangsan"); // 这个泛型方法是在调用时,才确定参数类型
}
}
package zhai.Fx;
import java.util.ArrayList;
import java.util.List;
public class FxDemo6 {
public static void main(String[] args) {
Object o = new Object(); // 父类
String s = new String(); // 子类
o = s; // 父类引用指向子类的对象
Object[] o1 = new Object[]{123};
String[] s2 = new String[]{"123"};
o1 = s2;
List<Object> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
// list1 = list2;
// 总结:A 和 B 是子类父类的关系,但是 G<A> 和 G<B> 不存在继承关系的,是并列关系
}
}