在运行时插入不同的对象,泛型JAVA
我在学习JAVA中的泛型时遇到了这一点: 泛型类型检查仅在编译时完成。在运行时修改代码以插入其他实例是个坏主意在运行时插入不同的对象,泛型JAVA,java,generics,Java,Generics,我在学习JAVA中的泛型时遇到了这一点: 泛型类型检查仅在编译时完成。在运行时修改代码以插入其他实例是个坏主意 我还不了解足够的Java来调整代码,以便在运行时执行此操作。也许是反思?因此,我无法尝试,看看会发生什么。那么,我的问题是,如果做了上述事情,会发生什么?为什么以及如何糟糕?您将得到一个ClassCastException。考虑这个例子(不做什么): List intList=new ArrayList(); 列表asRaw=intList;//糟糕!您的编译器将发出抱怨/警告。不要忽
我还不了解足够的Java来调整代码,以便在运行时执行此操作。也许是反思?因此,我无法尝试,看看会发生什么。那么,我的问题是,如果做了上述事情,会发生什么?为什么以及如何糟糕?您将得到一个
ClassCastException
。考虑这个例子(不做什么):
List intList=new ArrayList();
列表asRaw=intList;//糟糕!您的编译器将发出抱怨/警告。不要忽视它。
asRaw.add(“非数字”);
整数myInt=intList.get(0);//类卡斯特例外
这是因为泛型在编译时被擦除——也就是说,在内部,
ArrayList
只知道它有一堆对象。(Google for Java erasure获取更多信息。)编译时泛型转换为运行时强制转换,如果泛型使用是安全的(没有原始类型,没有参数化类型的数组,没有用于放入错误值的反射),则可以保证运行时强制转换能够工作。如果您的使用不安全(如上例所示),则强制转换可能会失败,从而导致ClassCastException
。实际上,这种情况可能发生在距离错误值输入的区域较远的地方,甚至距离错误值取出的地方较远的地方,因此很难找到它。您将得到一个ClassCastException
。考虑这个例子(不做什么):
List intList=new ArrayList();
列表asRaw=intList;//糟糕!您的编译器将发出抱怨/警告。不要忽视它。
asRaw.add(“非数字”);
整数myInt=intList.get(0);//类卡斯特例外
这是因为泛型在编译时被擦除——也就是说,在内部,ArrayList
只知道它有一堆对象。(Google for Java erasure获取更多信息。)编译时泛型转换为运行时强制转换,如果泛型使用是安全的(没有原始类型,没有参数化类型的数组,没有用于放入错误值的反射),则可以保证运行时强制转换能够工作。如果您的使用不安全(如上例所示),则强制转换可能会失败,从而导致ClassCastException
。事实上,这种情况可能发生在距离错误值输入的区域较远的地方,甚至距离错误值取出的地方较远的地方,因此很难追踪到错误值。无需反射:
import java.util.*;
public class Test {
public static void main(String[] args) {
List<String> strings = new ArrayList<String>();
Object tmp = strings;
// Unsafe cast
List<Integer> integers = (List<Integer>) tmp;
integers.add(10);
String x = strings.get(0); // Bang! (ClassCastException)
}
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
列表字符串=新的ArrayList();
对象tmp=字符串;
//不安全铸造
列表整数=(列表)tmp;
整数。加(10);
String x=strings.get(0);//Bang!(ClassCastException)
}
}
这确实给出了警告,但它仍然是有效代码。如果你很微妙的话,也许有一些方法可以在没有警告的情况下实现类似的事情。。。不要这样做
“会发生什么”的答案如上所示:你会得到一个例外,但可能比你预期的要晚。当您尝试使用rogue元素时,会出现异常,因为此时将有一个cast。无需反射:
import java.util.*;
public class Test {
public static void main(String[] args) {
List<String> strings = new ArrayList<String>();
Object tmp = strings;
// Unsafe cast
List<Integer> integers = (List<Integer>) tmp;
integers.add(10);
String x = strings.get(0); // Bang! (ClassCastException)
}
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
列表字符串=新的ArrayList();
对象tmp=字符串;
//不安全铸造
列表整数=(列表)tmp;
整数。加(10);
String x=strings.get(0);//Bang!(ClassCastException)
}
}
这确实给出了警告,但它仍然是有效代码。如果你很微妙的话,也许有一些方法可以在没有警告的情况下实现类似的事情。。。不要这样做
“会发生什么”的答案如上所示:你会得到一个例外,但可能比你预期的要晚。当您尝试使用rogue元素时,会出现异常,因为此时将有一个cast