我在Oracle的网站上读到了Java的类型擦除.
什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?
很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?
考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.
public class A {
public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)
现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.java与A.class在类路径中,javac的是足够聪明,引发警告.所以A.class 有一些类型信息存储在其中.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: …Run Code Online (Sandbox Code Playgroud) 问题1
是否在Groovy中使用(List对象列表)或List<String>(字符串列表)是无关紧要的?
在下面的代码示例中,两个列表最终都是ArrayList(对象的ArrayList).本来希望第二个列表是一个ArrayList<String>(字符串的ArrayList).
Groovy在编译类时是否会丢失类型信息,并在执行编译的类时推断它?
例1
List untypedList = ["a", "b", "c"]
List<String> typedList = ["a", "b", "c"]
println "Untyped list List: ${untypedList.getClass()}"
println "Typed list List<String>: ${typedList.getClass()}"
Run Code Online (Sandbox Code Playgroud)
输出1
Untyped list List: class java.util.ArrayList
Typed list List<String>: class java.util.ArrayList // Would have expected ArrayList<String>
Run Code Online (Sandbox Code Playgroud)
问题2
我原以为typedList << new Integer(1)下面示例中的行会因异常而失败,因为我正在尝试将一个int字符串列入.任何人都可以解释为什么我可以添加int到String-typed List?
输出显示它仍然是Integer,即它不是在运行中转换为String"1".
例2
List untypedList = ["a", "b", "c"]
List<String> typedList …Run Code Online (Sandbox Code Playgroud)