码迷,mamicode.com
首页 > 编程语言 > 详细

java类型擦除(Java Type Erasure Mechanism)

时间:2017-09-21 13:41:54      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:pes   att   jdk   sub   ati   cep   参数   类型信息   bsp   

在JDK5之后java提供了泛型(Java Genertics),允许在定义类的时候使用类型作为参数。泛型广泛应用于各类集合中。本文对其以及其用法进行介绍。

1、一个常见的错误

下面例子中,用List<Object>类型的参数来接收List<String>。

public class Main {
    public static void main(String[] args) throws IOException {
        ArrayList<String> al = new ArrayList<String>();
        al.add("a");
        al.add("b");
 
        accept(al);
    }
 
    public static void accept(ArrayList<Object> al){
        for(Object o: al)
            System.out.println(o);
    }
}

似乎Object是String的父类,并没有问题。但是,编译时候是不能通过的。报错如下:

The method accept(ArrayList < Object > ) in the type Main is not applicable for the arguments 
(ArrayList < String > )

2、List<Object> vs List<String>

原因是java类型擦除机制,在编译成class文件时候,编译器并未把Object和String类型信息编译进去。因此为了防止错误,编译器在编译时候发现他们不一致就会报错。

3、通配符和无界通配符

无界通配符List<?> 可接收任何类型

public static void main(String args[]) {
        ArrayList<Object> al = new ArrayList<Object>();
        al.add("abc");
        test(al);
    }
 
    public static void test(ArrayList<?> al){
        for(Object e: al){//no matter what type, it will be Object
            System.out.println(e);
// in this method, because we don‘t know what type ? is, we can not add anything to al. 
        }
    }

通配符

 

List< Object > - List can contain Object or it‘s subtype

List< ? extends Number > -  List can contain Number or its subtypes.
List< ? super Number > - List can contain Number or its supertypes.

  

java类型擦除(Java Type Erasure Mechanism)

标签:pes   att   jdk   sub   ati   cep   参数   类型信息   bsp   

原文地址:http://www.cnblogs.com/qins/p/7567663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!