资讯专栏INFORMATION COLUMN

java类型擦除

MageekChiu / 741人阅读

摘要:因为符号可以匹配任意类型,因此可以处理任意类型的数据。因为原生态类型没有限制,所以它很容易是集合混乱,换句话说,无界通配符是安全的而原生态类型不是安全的。

我们都知道无界通配符(unbounded wildcard) Set可以处理任意类型数据,原生态类型(raw type)Set也能处理任意类型数据,但是他们区别是什么呢。
1、关于Set的两个要点。

因为符号?可以匹配任意类型,因此Set可以处理任意类型的数据。

因为我们不知道?指的是什么类型,因此我们不能忘Set里面添加任何类型的数据。

这两点看起来是不是很矛盾,其实并不矛盾,看下面的两个例子

第一要点代码如下

//代码不报错
public static void main(String[] args) {
    HashSet s1 = new HashSet(Arrays.asList(1, 2, 3));
    printSet(s1);
 
    HashSet s2 = new HashSet(Arrays.asList("a", "b", "c"));
    printSet(s2);
}
 
public static void printSet(Set s) {
    for (Object o : s) {
        System.out.println(o);
    }
}

第二要点代码如下

public static void printSet(Set s) {
    s.add(10);// 本行代码报错
    for (Object o : s) {
        System.out.println(o);
    }
}

这是因为我们不知道?所指类型,因此除了null外的所有类型我们都不能往里面添加。同样的,我们不能初始化一个Set类型为?,如下

Set set = new HashSet();
2、Set vs Set

看如下代码,是不会报错的。

public static void printSet(Set s) {
    s.add("2");
    for (Object o : s) {
        System.out.println(o);
    }
}

因为原生态类型没有限制,所以它很容易是集合混乱,换句话说,无界通配符是安全的而原生态类型不是安全的。

3、何时使用Set

当你使用泛型(generic type),但是你又不想关心实际泛型是什么的时候,使用无界通配符。如下:

public static void main(String[] args) {
    HashSet s1 = new HashSet(Arrays.asList(1,2,3));
    HashSet s2 = new HashSet(Arrays.asList(4,2,3));
 
    System.out.println(getUnion(s1, s2));
}
 
public static int getUnion(Set s1, Set s2){
    int count = s1.size();
    for(Object o : s2){
        if(!s1.contains(o)){
            count++;
        }
    }
    return count;
转自我的博客园 http://cnblogs.com/qins/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70862.html

相关文章

  • Java™ 教程(类型擦除

    类型擦除 泛型被引入到Java语言中,以便在编译时提供更严格的类型检查并支持通用编程,为了实现泛型,Java编译器将类型擦除应用于: 如果类型参数是无界的,则用它们的边界或Object替换泛型类型中的所有类型参数,因此,生成的字节码仅包含普通的类、接口和方法。 如有必要,插入类型转换以保持类型安全。 生成桥接方法以保留扩展泛型类型中的多态性。 类型擦除确保不为参数化类型创建新类,因此,泛型不会...

    zsy888 评论0 收藏0
  • Java 泛型总结(一):基本用法与类型擦除

    摘要:然而中的泛型使用了类型擦除,所以只是伪泛型。总结本文介绍了泛型的使用,以及类型擦除相关的问题。一般情况下泛型的使用比较简单,但是某些情况下,尤其是自己编写使用泛型的类或者方法时要注意类型擦除的问题。 简介 Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型。泛型可以用于类、接口、方法,通过使用泛型可以使代码更简单、安全。然...

    Java_oldboy 评论0 收藏0
  • Java泛型:类型擦除

    博客地址:Java泛型:类型擦除 前情回顾 Java泛型:泛型类、泛型接口和泛型方法 类型擦除 代码片段一 Class c1 = new ArrayList().getClass(); Class c2 = new ArrayList().getClass(); System.out.println(c1 == c2); /* Output true */ 显然在平时使用中,ArrayList...

    Hanks10100 评论0 收藏0
  • 初探Java类型擦除

    摘要:可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。相应的,泛型类中定义的方法的类型也是如此。参考语言类型擦除下界通配符和的区别 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。 // 指定泛型为String List list1 ...

    DevTalking 评论0 收藏0
  • Java系列之泛型

    摘要:总结泛型的类型必须是引用类型,不能是基本类型,泛型的个数可以有多个,可以使用对创建对象时的泛型类型以及方法参数类型进行限制,如使用关键字和对泛型的具体类型进行向下限制或向上限制,最后一点,可以声明泛型数组,但是不能创建泛型数组的实例。 自从 JDK 1.5 提供了泛型概念,泛型使得开发者可以定义较为安全的类型,不至于强制类型转化时出现类型转化异常,在没有反省之前,可以通过 Object...

    MadPecker 评论0 收藏0
  • Java泛型总结

    摘要:静态变量是被泛型类的所有实例所共享的。对于这个类型系统,有如下的一些规则相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。在代码中避免泛型类和原始类型的混用。参考泛型类型擦除 Java泛型总结 Java泛型是JDK5引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用的时候使用具体的类型来替换。泛型最主要的应用是在JDK5...

    CoreDump 评论0 收藏0

发表评论

0条评论

MageekChiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<