在Java中可以使用以下方法:
ArrayList<IMyType> list
到
ArrayList<MyType>
如果
MyType implements IMyType
答案 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>
的子类型。只有MyType
是IMyType
的子类型。您可以做的是,您可以迭代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;