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

时间:2010-10-22 12:07:35

标签: java generics casting

为什么以下代码会编译?
如果参数为a,为什么允许将通用列表转换为其类型参数 接口但不是通用的超级接口?

这是什么意思?

//Connection can be substituted by any interface
List<Connection> list = null;
Connection c = (Connection) list; 

3 个答案:

答案 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(...);
}