Java中泛型需要注意的点以及泛型方法(2022.5.14)

泛型中需要注意的点

  • 泛型中可以存放多个参数类型
    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> 不存在继承关系的,是并列关系
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值