范型擦除的坑

   最近我们遇到了一个问题,这边记录一下,说白了还是boolean 利用范型转换String的坑的问题:

Java泛型中最令人苦恼的地方或许就是类型擦除了,特别是对于有C++经验的程序员。类型擦除就是说Java泛型只能用于在编译期间的静态类型检查,然后编译器生成的代码会擦除相应的类型信息,这样到了运行期间实际上JVM根本就知道泛型所代表的具体类型。这样做的目的是因为Java泛型是1.5之后才被引入的,为了保持向下的兼容性,所以只能做类型擦除来兼容以前的非泛型代码。对于这一点,如果阅读Java集合框架的源码,可以发现有些类其实并不支持泛型。

我们先来看一下下面这个简单的例子:

public class Node<T> {
    private T data;
    private Node<T> next;
    public Node(T data, Node<T> next) {
        this.data = data;
        this.next = next;
    }
    public T getData() { return data; }
    // ...
}

实际上到了运行期间上面这段代码实际上将转换成:

public class Node {
    private Object data;
    private Node next;
    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }
    public Object getData() { return data; }
    // ...
}

因为范型擦除的问题,就导致我们在编写代码的时候,以为他是String类型,但是在运行时候其实是Boolean型或者Double型,然后报错。

http://www.importnew.com/24029.html

0

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.