集合元素的内部演员

时间:2014-01-30 10:34:35

标签: java collections casting

在Java中可以使用以下方法:

ArrayList<IMyType> list

ArrayList<MyType>

如果

MyType implements IMyType

5 个答案:

答案 0 :(得分:5)

如果您完全确定list仅包含MyType(或其子类型)的实例,那么您可以执行类似

的操作
@SuppressWarnings("unchecked")
List<MyType> myList = (List<MyType>) (List<?>) list;

这将首先将您的IMyType列表转换为任何类型<?>的列表,然后您可以将其转换为更精确的类型。但请务必仅在list包含MyType的实例且仅包含其他内容的情况下使用它。

无论如何,这种方法很少使用,在大多数情况下可以用

代替
List<? extends IMytype>

List<? super MyType>

答案 1 :(得分:1)

不,这是因为ArrayList<MyType>不是ArrayList<IMyType>的子类型。只有MyTypeIMyType的子类型。您可以做的是,您可以迭代ArrayList<IMyType>并获取IMyType对象,然后键入强制转换为MyType实例,如

IMyType iMyType = ..

MyType myType = (MyType)iMyType;

答案 2 :(得分:1)

如果您确定IMyType中的所有List都是MyType,则可以强制执行未经检查的转换类型变量:

List<IMyType> l1;
List rawList = l1;
List<MyType> l2 = rawList;

List<IMyType> l1;
List<MyType> l2 = (List) l1;

注意:如果从ClassCastException检索元素(例如,在[增强型] l2循环中迭代),这将在运行时生成for并且它不是不是MyType

请记住,这更像是一个黑客而不是一个正确的解决方案,并且完全绕过类型安全(这是泛型基本上是什么)。

这可能暗示了对类的建模和/或它们的使用方式不太恰当。

答案 3 :(得分:0)

你可以试试这个。您无法直接投射ArrayList。你可以逐个施放

 ArrayList<IMyType> list=new ArrayList<IMyType>();
 ArrayList<MyType> list2=new ArrayList<MyType>();
 for(IMyType i:list){
    list2.add((MyType)i);
 }

答案 4 :(得分:0)

在这种情况下你可以进行投射:( Inteder扩展Number

List<IMyType> list1 = new ArrayList<>();
List<? extends IMyType> list2 = new ArrayList<>();

list2 = list1;