这看起来非常基本,但是当我们将java.util.Enumeration
投射到像java.util.List
这样的时候:
// Enumeration getInitParameterNames()
java.util.List e2 = (List) getServletConfig().getInitParameterNames();
我们正在做什么"向下铸造"或者"向上铸造"?
这两个界面也没有任何共同点(除了它们都在java.util
内)(public interface Enumeration<E>
和public interface List<E>
extends Collection<E>
)
那么为什么我们甚至可以把它们互相投射呢?
答案 0 :(得分:2)
你既不是“向下投射”也不是“向上投射”(因为它们都不是另一个的子类型)。
如果getServletConfig().getInitParameterNames()
的结果是实现List
的对象,则可以在代码中显示它。否则你会得到ClassCastException
。
两个接口有什么共同之处并不重要。对象可以实现两个接口:
class InitParameterNames implements Enumeration, List {
...
}
答案 1 :(得分:1)
通过执行这样的转换,编译器认为您绝对确定要转换的两种类型是兼容的。它不会抱怨。
如果两种类型实际上不兼容,运行时将抛出ClassCastException。我认为情况就是如此。
修改强>
编译器可以运行某些类型的强制转换,主要是Java预定义类型:
Map<String, String> map = new ConcurrentHashMap<String, String>();
List l = (List)map;
Set s = (Set)map;
Date d = (Date)map;
IllegalArgumentException e = (IllegalArgumentException)map;
编译器上面的强制转换都很好,但是会有ClassCastException。
但是,如果你试图施放:
Double dd = (Double)map;
这将是一个编译错误,因为编译器知道Double是什么。