Java擦除和转换实例分析

本文实例讲述了Java擦除和转换。分享给大家供大家参考,具体如下:

一 点睛

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

当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,则所有在尖括号之间的类型信息都被扔掉了。比如说一个List<String>类型被转换为List,则该List对集合元素的类型检查变成了成类型变量的上限(即Object),这种情况被为擦除。

二 实战——擦除

class Apple<T extends Number>
{
  T size;
  public Apple()
  {
  }
  public Apple(T size)
  {
   this.size = size;
  }
  public void setSize(T size)
  {
   this.size = size;
  }
  public T getSize()
  {
   return this.size;
  }
}
public class ErasureTest
{
  public static void main(String[] args)
  {
   Apple<Integer> a = new Apple<>(6);  // ①
   // a的getSize方法返回Integer对象
   Integer as = a.getSize();
   // 把a对象赋给Apple变量,丢失尖括号里的类型信息
   Apple b = a;   // ②
   // b只知道size的类型是Number
   Number size1 = b.getSize();
   // 下面代码引起编译错误
   //Integer size2 = b.getSize(); // ③
  }
}

三 实战——擦除与转换

import java.util.*;
public class ErasureTest2
{
  public static void main(String[] args)
  {
   List<Integer> li = new ArrayList<>();
   li.add(6);
   li.add(9);
   List list = li;
   // 下面代码引起“未经检查的转换”的警告,编译、运行时完全正常
   List<String> ls = list;   // ①
   // 但只要访问ls里的元素,如下面代码将引起运行时异常。
   //System.out.println(ls.get(0));
  }
}

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java编程探索之泛型擦除实例解析

    1.问题引出 源码: public static void main(String[] args) { List<Integer> a = new ArrayList<Integer>(); List<String> b = new ArrayList<String>(); System.out.println(a.getClass() == b.getClass());//结果true } 编译后L public static void main(Stri

  • java list与数组之间的转换详细解析

    1 数组转换为List调用Arrays类的静态方法asList. asListpublic static <T> List<T> asList(T... a)Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.) This method acts as bridge between a

  • 详解Java类型擦除机制

    Java泛型是JDK 5引入的一个特性,它允许我们定义类和接口的时候使用参数类型,泛型在集合框架中被广泛使用.类型擦除是泛型中最让人困惑的部分,本篇文章将阐明什么是类型擦除,以及如何使用它. 一个常见错误 package simplejava; import java.util.ArrayList; public class Q29 { public static void main(String[] args) { ArrayList<String> al = new ArrayList&l

  • 详解java 中泛型中的类型擦除和桥方法

    在Java中,泛型的引入是为了在编译时提供强类型检查和支持泛型编程.为了实现泛型,Java编译器应用类型擦除实现: 1.  用类型参数(type parameters)的限定(如果没有就用Object)替换泛型类型中的所有类型参数. 2.  需要保持类型安全的时候插入类型转换(隐含插入) 3.  在extened 泛型类型中生成桥方法来保证多态性 类型擦除确保不会为已参数化了的类型(paramterized types)产生新类,这样泛型能保证没有运行时的负载. 泛型类型擦除 在类型擦除过程中,

  • 用Java将字符串的首字母转换大小写

    话不多说,直接上代码 //首字母转小写 public static String toLowerCaseFirstOne(String s){ if(Character.isLowerCase(s.charAt(0))) return s; else return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); } //首字母转大写 public

  • 简单理解java泛型的本质(非类型擦除)

    背景 之前在网上发现这个问题 public class GenericTest { //方法一 public static <T extends Comparable<T>> List<T> sort(List<T> list) { return Arrays.asList(list.toArray((T[]) new Comparable[list.size()])); } //方法二 public static <T extends Compara

  • Java 泛型总结(一):基本用法与类型擦除

    简介 Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型.泛型可以用于类.接口.方法,通过使用泛型可以使代码更简单.安全.然而 Java 中的泛型使用了类型擦除,所以只是伪泛型.这篇文章对泛型的使用以及存在的问题做个总结,主要参考自 <Java 编程思想>. 这个系列的另外两篇文章: Java 泛型总结(二):泛型与数组 Java 泛型总结(三):通配符的使用 基本用法 泛型类 如果有一个类 Holder 用于包装一个变量,这个变

  • java实现时间与字符串之间转换

    本文实例为大家分享了java实现时间与字符串之间转换的具体代码,供大家参考,具体内容如下 1. long字符串转换成yyyy-MM-dd HH:mm:ss格式输出 import java.text.SimpleDateFormat; import java.util.Date; //将long字符串转换成格式时间输出 public class LongToString { public static void main(String argsp[]){ String time="12560061

  • Java ArrayList 数组之间相互转换

    做研发的朋友都知道,在项目开发中经常会碰到list与数组类型之间的相互转换,本文通过一个简单的例子给大家讲解具有转换过程. Java代码 package test.test1; import java.util.ArrayList; import java.util.List; public class Test { /** * @param args */ public static void main(String[] args) { List list=new ArrayList(); l

  • Java中Date,Calendar,Timestamp的区别以及相互转换与使用

    1 Java.util.Date包含年.月.日.时.分.秒信息. 复制代码 代码如下: // String转换为DateString dateStr="2013-8-13 23:23:23";String pattern="yyyy-MM-dd HH:mm:ss";DateFormate dateFormat=new SimpleDateFormat(pattern);Date date=dateFormat.parse(dateStr);date=dateForm

随机推荐