Java 集合元素的内部强制转换
在Java中,有没有一种方法可以强制转换以下内容:Java 集合元素的内部强制转换,java,collections,casting,Java,Collections,Casting,在Java中,有没有一种方法可以强制转换以下内容: ArrayList列表 进入 ArrayList 如果 MyType实现IMyType ?否,这是因为ArrayList不是ArrayList的子类型。只有MyType是IMyType的子类型。您可以做的是迭代ArrayList并获取IMyType对象,然后像这样将其类型转换为MyType实例 IMyType iMyType = .. MyType myType = (MyType)iMyType; 你可以试试这个。您不能直接强制转换Arr
ArrayList列表
进入
ArrayList
如果
MyType实现IMyType
?否,这是因为
ArrayList
不是ArrayList
的子类型。只有MyType
是IMyType
的子类型。您可以做的是迭代ArrayList
并获取IMyType
对象,然后像这样将其类型转换为MyType
实例
IMyType iMyType = ..
MyType myType = (MyType)iMyType;
你可以试试这个。您不能直接强制转换
ArrayList
。你可以一个接一个地投
ArrayList<IMyType> list=new ArrayList<IMyType>();
ArrayList<MyType> list2=new ArrayList<MyType>();
for(IMyType i:list){
list2.add((MyType)i);
}
ArrayList list=new ArrayList();
ArrayList list2=新的ArrayList();
对于(IMyType i:列表){
列表2.添加((MyType)i);
}
如果您确定列表中的所有IMyType
都是MyType
,您可以强制执行未经检查的转换类型变量分配:
List<IMyType> l1;
List rawList = l1;
List<MyType> l2 = rawList;
列表l1;
列表rawList=l1;
列表l2=原始列表;
或
列表l1;
列表l2=(列表)l1;
注意:如果您从l2
检索元素(例如,在[enhanced]for
循环中迭代),并且它不是MyType
,则在运行时将生成ClassCastException
请记住,这与其说是一个合适的解决方案,不如说是一个黑客,而且完全绕过了类型安全性(泛型基本上就是这样)
这可能暗示类的建模和/或它们的使用方式不太正确。在这种情况下,您可以执行cast:(Inteder
extendsNumber
)
List list1=new ArrayList();
List如果您完全确定您的列表
只包含MyType
(或其子类型)的实例,则可以执行以下操作
@SuppressWarnings("unchecked")
List<MyType> myList = (List<MyType>) (List<?>) list;
或
list因此获取ArrayList
的唯一方法是迭代所有元素并进行转换?我已经更新了我的答案:)是的,这是唯一的方法。。谁离开了-1?:)这个我没有downvote@sanbhat谢谢你的建议…非常感谢。。这正是我想要的。还感谢您提供有关类型安全的建议。我的特殊问题是,我从Java RMI方法中获得了一个类型为ArrayList
的ArrayList。然后我想使用这个列表,但不再使用指向RMI类型的链接(即IMyTxpe
),而是使用列表元素的内部表示形式,即MyType
。
List<IMyType> list1 = new ArrayList<>();
List<? extends IMyType> list2 = new ArrayList<>();
list2 = list1;
@SuppressWarnings("unchecked")
List<MyType> myList = (List<MyType>) (List<?>) list;
List<? extends IMytype>
List<? super MyType>