美文网首页
java泛型的魔性

java泛型的魔性

作者: 炫迈哥 | 来源:发表于2019-03-12 11:26 被阅读0次

1. 原生类型能赋值给任何类型的泛型

如: List可以赋值给List<?> List<Object> List<Long> 等

因为List这种原生类型是老版本java兼容而保留的, 要想与新的泛型兼容,必须要能强制转化,如:

  • 老版本的代码
public class A {

 public static List test(){
  ...
}

public static void main(String[] args){
   List a = test();
}

}

  • 新版本代码
public class A {

 public static List test(){
  ...
}

public static void main(String[] args){
   List<String> a = (List<String>)test();
}

}

2.List<?>

他表示使用者根本不关心泛型内容, 与List<Object>有本质区别

所以,编译器不会允许往里面设置任何值, 获取值是可以的

tips: 任何类型泛型都可以赋值给 <?>

3.任何类型的泛型相互之间均可以通过原生泛型作为媒介转换

        List<Long> r = null;

        List<String> s = Arrays.asList("1", "2");

        List c = s;

        r = c;

神奇的将 List<String>转换成了List<Long>,编译器也不会报错

    1. java编译器在运行时会泛型擦除, 所有的T ,E这些泛型均直接用Object类型表示

所以 :

  System.out.println(r.get(0));

是可以正常打印输出的! 为什么 ? 1. r.get(0)这段代码对编译器来说只是把值作为Object类型拿出来 2. System.out.println 接受的参数也是Object类型

    1. 当获取值有指定类型接收变量时, 会直接报类型转换错误
Long value = result.getValue();  // 以long类型接收, 因为值本来是字符串,所以无法转换成long,报错
    1. 链式调用getClass方法报类型转换异常
Object first = result.getValue();

System.out.println(first.getClass());  // 正常打印

System.out.println(result.getValue().getClass());  // 报类型转换异常

查看class文件 System.out.println(((Long)s.getValue()).getClass()); 链式调用时会先进行类型转换

相关文章

  • java泛型的魔性

    1. 原生类型能赋值给任何类型的泛型 如: List可以赋值给List List List...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • Kotlin 泛型

    说起 kotlin 的泛型,就离不开 java 的泛型,首先来看下 java 的泛型,当然比较熟悉 java 泛型...

  • 九、泛型

    九、泛型 尽量不要写这种有能与泛型方法重载的代码,有迷惑性 限定传入 T 的类型 泛型数组 Java 不支持泛型类...

  • 第二十八课:泛型

    泛型出现之前 泛型出现之后 Java深度历险(五)——Java泛型

  • java泛型中类型擦除的一些思考

    java泛型 java泛型介绍 java泛型的参数只可以代表类,不能代表个别对象。由于java泛型的类型参数之实际...

  • Java 泛型

    什么是泛型 Java 1.5 开始引进的参数性类型的,是在编译器进行类型擦除的类型转化,所以Java的泛型是伪范型...

  • JAVA 核心笔记 || [xxx] 泛型

    泛型 JAVA 的参数化类型 称为 泛型 泛型类的设计 Learn12.java 运行

  • Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

    Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型 在代码进入和离开的边界处,会处理泛型 Java泛型作...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

网友评论

      本文标题:java泛型的魔性

      本文链接:https://www.haomeiwen.com/subject/czrgpqtx.html