Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时插入不同的对象,泛型JAVA_Java_Generics - Fatal编程技术网

在运行时插入不同的对象,泛型JAVA

在运行时插入不同的对象,泛型JAVA,java,generics,Java,Generics,我在学习JAVA中的泛型时遇到了这一点: 泛型类型检查仅在编译时完成。在运行时修改代码以插入其他实例是个坏主意 我还不了解足够的Java来调整代码,以便在运行时执行此操作。也许是反思?因此,我无法尝试,看看会发生什么。那么,我的问题是,如果做了上述事情,会发生什么?为什么以及如何糟糕?您将得到一个ClassCastException。考虑这个例子(不做什么): List intList=new ArrayList(); 列表asRaw=intList;//糟糕!您的编译器将发出抱怨/警告。不要忽

我在学习JAVA中的泛型时遇到了这一点:

泛型类型检查仅在编译时完成。在运行时修改代码以插入其他实例是个坏主意


我还不了解足够的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