Java 之 泛型擦除

泛型擦除

  在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但为了与老的 Java 代码保持一致,也允许在使用带泛型声明的类时不指定类型参数。如果没有为这个泛型类指定泛型参数,则该类型参数被称作一个原始类型(raw Type)。

  如果在使用泛型类或泛型接口的时候,没有指定泛型实参,会怎么样?(泛型擦除现象,泛型擦除后,泛型形参被解析为什么类型呢?)

  (1)如果没有指定泛型形参的上限,就按照 Object 处理;

  (2)如果指定泛型形参的上限,就按照上限处理,如果有多个上限,多个上限用&连接,按照最左边的第一个上限处理。

  Demo:

 1 public class TestErase {
 2     public static void main(String[] args) {
 3         //ArrayList<String>被转换为了ArrayList
 4         ArrayList list = new ArrayList<String>();
 5         list.add("Hello");
 6         list.add("World");
 7         //泛型被擦除,按照默认上限Object处理
 8         Object object = list.get(1);
 9
10         Student s = new Student("张三",12);
11
12         //泛型被擦除,按照第一个上限Number处理
13         Number score = s.getScore();
14     }
15 }
16 class Student<T extends Number & java.io.Serializable>{
17     private String name;
18     private T score;
19     public Student(String name, T score) {
20         super();
21         this.name = name;
22         this.score = score;
23     }
24     public T getScore() {
25         return score;
26     }
27 }

原文地址:https://www.cnblogs.com/niujifei/p/12208188.html

时间: 2024-10-08 17:26:38

Java 之 泛型擦除的相关文章

Java:泛型擦除

https://docs.oracle.com/javase/tutorial/java/generics/erasure.html 原文地址:https://www.cnblogs.com/huiAlex/p/8280859.html

java泛型擦除的神秘之处,边界处的动作,擦除的补偿

java泛型擦除的神秘之处 package org.rui.generics.erasure; public class HasF { public void f(){ System.out.println("hasf.f"); } } package org.rui.generics.erasure; /** * 边界 <T extneds Hasf>声明T必须具有类型HasF或者从Hasf导出的类型. * 如果情况确实如此,那么就可以安全地在obj上调用f()了 * T

Java中泛型 类型擦除

转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下面一个列子,代码如下: public class Foo { public void listMethod(List<String> stringList){ } public void listMethod(List<Integer> intList) {

Java泛型擦除

Java泛型擦除: 什么是泛型擦除? 首先了解一下什么是泛型?我个人的理解:因为集合中能够存储随意类型的对象.可是集合中最先存储的对象类型一旦确定后,就不能在存储其它类型的对象了,否则,编译时不会报错.但执行时会抛出ClassCastException异常.为解决此问题,引入泛型,指定该集合对象中存储的对象类型,这样一旦该集合中存储了其它的对象类型,编译时会提示错误!(理解不当之处.希望大神多指点). 泛型的擦除就是说.在编译的时候集合中指定了确定的对象类型,但在执行时将集合中能够存储的该对象类

Java中泛型区别以及泛型擦除详解

一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种编译器使用的范式,语法糖的一种,能保证类型安全.[注意:继承中,子类泛型数必须不少于父类泛型数] 为了方便理解,我将泛型分为普通泛型和通配泛型 三.泛型分类 1.普通泛型 就是没有设置通配的泛型,泛型表示为某一个类. 声明时: class Test<T>{...} 使用时: Test<Int

泛型深入--java泛型的继承和实现、泛型擦除

泛型实现类: package generic; /** * 泛型父类:子类为“富二代”:子类的泛型要比父类多 * 1,保留父类的泛型-->子类为泛型类 * 2,不保留父类泛型-->子类按需实现 * * * 子类[重写方法]的参数类型 -->随父类而定 * 子类新增的方法,参数类型随子类而定 * 子类中使用父类的[属性] -->随父类而定 * 子类使用自己的属性-->随子类而定 * @author Administrator * */ public abstract class

Java 泛型 Java使用泛型的意义

Java 泛型 Java使用泛型的意义 @author ixenos 直接意义 在编译时保证类型安全 根本意义 a) 类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板 b) 使用复用性模板时不用手动强制类型转换 三种泛型实现方式的优缺点 C++:模板方式实现,在编译时完全展开并且支持偏特化,类型精度高,代码共享差: Java 5:擦除方式实现,仅用于编译时类型检查,在运行时擦除,向后兼容性好,代码共享好,类型精度非常差: C# 2.0:混合方式实现,在运行时展开特化,类型精度高,

Java 中泛型的全面解析

Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中.对于泛型概念的引入,开发社区的观点是褒贬不一.从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误.而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的

泛型擦除 反射 自动装配

1.泛型擦除 package cn.itcast.demo; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Demo1 { public static void main(String[] args) throws SecurityExceptio