为什么以下代码会编译?
如果参数为a,为什么允许将通用列表转换为其类型参数
接口但不是通用的超级接口?
这是什么意思?
//Connection can be substituted by any interface
List<Connection> list = null;
Connection c = (Connection) list;
答案 0 :(得分:12)
这与type参数无关。这也有效:
List<String> list = null;
Connection c = (Connection) list;
这是可能的,因为List
是一种接口类型。列表引用可能包含一个实现List
接口的对象,并且也一个Connection
(无论是类,接口),以及演员因此工作。
因此,由于强制转换可以工作,编译器允许它。它只会拒绝理论上不可能的强制转换,即在单独的继承层次结构中涉及具体类型:
JComponent c = null;
ArrayList l = (ArrayList) c;
你可以在编译时Java Language Specification查找有关哪些类型的演员表合法的确切规则 - 它是大约30行密集语言律师。
答案 1 :(得分:0)
它编译但在执行时会失败。
静态转换是开发人员告诉编译器的一种方式我知道我在这里做什么 - 我将自己处理这些变量的输入。编译器不会阻止你做那些事情将在执行时抛出异常。
答案 2 :(得分:0)
同样的事情,就像其他类型转换一样。您可以将几乎任何对象转换为任何其他对象。编译器不允许最愚蠢的类型转换(如List to String),但仍然 - 由你来观看类型转换。通常,使用
if(a instanceof bClass){
((bClass)a).doSomething(...);
}