将枚举强制转换为列表

时间:2014-11-07 21:01:03

标签: java casting

这看起来非常基本,但是当我们将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>

那么为什么我们甚至可以把它们互相投射呢?

2 个答案:

答案 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是什么。