List<Integer>.class 编译通不过,如何解释

2019-10-10 22:44:00 +08:00
 amiwrong123
import java.io.*;
import java.util.*;

public class ClassCasting {
    //@SuppressWarnings("unchecked")
    public void f(String[] args) throws Exception {
        ObjectInputStream in = new ObjectInputStream(
                new FileInputStream(args[0]));
    List<Integer> shapes = (List<Integer>)in.readObject();

        // Won't Compile:
    //List<Integer> lw1 = List<Integer>.class.cast(in.readObject());
        List lw2 = List.class.cast(in.readObject());
        List<Integer> lw3 = List.class.cast(in.readObject());
    }
    public static void main(String[] args) { }
} ///:~

这是 java 编程思想里面的一个小例子,里面有个小知识点。就是 List<Integer>.class 这样用不可以,但 List.class 这样用是可以的。

这里我用自己的话解释一波:因为泛型是假泛型,所以 Class 对象(public final class Class<T>)只能记住泛型类的原生类型 raw type。这么解释对吗?

2465 次点击
所在节点    Java
4 条回复
chendy
2019-10-10 23:21:40 +08:00
因为只有 List.class 没有 List<Integer>.class
Raymon111111
2019-10-10 23:39:29 +08:00
换个理解的方式

List<Integer> 这么写只是为了编译检查用的, 所以不存在对应的 class
amiwrong123
2019-10-10 23:42:02 +08:00
@chendy
@Raymon111111
对哈,从这个角度就好理解多了。不管是 List<Integer>,还是 List<String>,实际上编译生成的 Class 文件,永远只有一份。
ZredoC
2019-10-13 16:08:16 +08:00
泛型只是编译阶段为了防止输入错误类型而存在的,可以通过反射的 invoke 操作绕过编译,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/608037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX