Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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_Casting - Fatal编程技术网

Java 为什么可以将泛型列表强制转换为其类型参数

Java 为什么可以将泛型列表强制转换为其类型参数,java,generics,casting,Java,Generics,Casting,为什么要编译下面的代码? 如果参数是类型参数,为什么允许将泛型列表强制转换为其类型参数 接口,但不是泛型的超级接口 这是什么意思 //Connection can be substituted by any interface List<Connection> list = null; Connection c = (Connection) list; //任何接口都可以替换连接 List=null; 连接c=(连接)列表; 它可以编译,但在执行时会失败 静态转换是开发人员告诉编

为什么要编译下面的代码?
如果参数是类型参数,为什么允许将泛型列表强制转换为其类型参数 接口,但不是泛型的超级接口

这是什么意思

//Connection can be substituted by any interface
List<Connection> list = null;
Connection c = (Connection) list; 
//任何接口都可以替换连接
List=null;
连接c=(连接)列表;

它可以编译,但在执行时会失败


静态转换是开发人员告诉编译器我知道我在这里做什么的一种方式——我将自己处理这些变量的类型。编译器不会阻止您执行在执行时抛出异常的操作。

这与类型参数无关。这同样有效:

List<String> list = null;
Connection c = (Connection) list; 

您可以在中查找编译时哪些类型的强制转换是合法的确切规则-大约有30行密集的语言律师。

与其他类型强制转换一样。您可以将几乎任何对象投射到任何其他对象。编译器不允许最愚蠢的类型转换(比如从列表到字符串),但仍然-这取决于您是否观看类型转换。一般来说,使用

if(a instanceof bClass){
    ((bClass)a).doSomething(...);
}

但在编译时很明显,强制转换将在运行时失败,不是吗?当试图执行字符串bla=(String)BigDecimal.ZERO时,编译器也会停止我;那么为什么不在这里呢?更确切地说,它会抛出一个java.lang.ClassCastException。-1:实际上,它不会在运行时失败,因为null与所有类型都兼容。静态错误检查并不是为了达到完美,只是尽可能多地捕捉错误。你可以找到100种方法来欺骗编译器编译坏代码。。。我们大多数人都不想要一个像保姆状态一样运行的编译器。@MRalwasser:不清楚它是否会在编译时的运行时失败<代码>列表是一个接口,无论
连接
的子类型存储在变量
c
中,它都可以实现列表。看看@Michael Borgwardt的答案。到底是什么让一些打字白痴?这就是问题所在?@Ishtar:在List-to-String的情况下,它不能工作,因为String不实现List,而是final。JLS指定了这类事情(现在查找它)@Micheal-是的,我也这么认为。我只是想说,这个答案并没有真正回答这个问题:
如果参数是接口而不是泛型的超级接口,为什么允许它对其类型参数强制转换泛型列表?
@Ishtar typecasts,这显然是不可能的。例如,您不能将类型转换为final类(如果它没有实现相同的接口),因为很明显final类没有子类,这些子类可以转换为其父类。+1-但是。。。“它只会拒绝理论上不可能的强制转换…”仅基于声明的类型。例如,如果列表被初始化为最终的
列表
类,而该类没有实现或扩展
连接
,编译器仍然必须允许这样做。
if(a instanceof bClass){
    ((bClass)a).doSomething(...);
}