ava*_*lon 5 java generics wildcard object type-erasure
我希望理解这个概念:
T object  -  generic,将被删除为实际类型.? 对象 - 会被抹去什么?Object 宾语;之间有什么区别T,?和Object?
我很容易理解#1,但是怎么样:
Object var;
? var;
两者有什么区别?我已经读过,我不能?明确地使用,像T或任何其他变量,并且它?与对象有关,而不是类型.
但实际原因是什么?为什么我不能只写一个List对象(List<Object>)而不是List通配符(List<?>)?因为我不知道两种情况下的对象类型.
另外,我想知道什么是擦除??
我将列出T和之间的主要区别?:
Basic:T是一个类型参数,?是一个通配符.
含义:T在定义泛型类时用作类型参数.T在实例化泛型类时,将由具体类型替换.另一方面,我们?在想要引用未知类型参数时使用.
T如果定义了泛型方法,则需要在类的顶部或方法中声明.你可以? 随处使用.T都映射到相同的类型(在同一个类中).每次使用?都可以映射到不同的类型.T一样new ArrayList<T>().你不能实例化对象,但只有指针用?.集合更新:您可以将对象添加到类型集合中T.您无法将对象添加到类型集合中?(因为您不知道其类型).
类型擦除:使用泛型,类型擦除适用于泛型的使用.使用泛型时,它们将转换为编译时检查和执行时转换.所以如果你有这样的代码例如:List<String> myList = new ArrayList<String>();然后你希望添加到你的列表所以你做myList.add("Hello World");,然后你想get通过执行你刚刚添加的项目String myString = myList.get(0);然后编译器将编译你的代码List myList = new ArrayList();和String myString = (String) myList.get(0);(由于add显而易见的原因保持相同).
所以基本上,在执行时,没有办法找出T主要String是列表对象(该信息消失).
 
现在,对于通配符来说,故事是不同的.通配符(?)被替换为Object(因为它是无界的).这不是很有用.在构建时,编译器将检查您是否只调用其Object行为.如果你有类似的东西? extends Foo,则将其?替换为其绑定Foo(在构建时,编译器将检查您是仅传递Foo或其任何子类型(继承自的类型Foo)作为参数).
对于?和Object&之间的差异T,Object您可以分别在这里和这里阅读.
| 归档时间: | 
 | 
| 查看次数: | 624 次 | 
| 最近记录: |