Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集合元素的内部强制转换_Java_Collections_Casting - Fatal编程技术网

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

在Java中,有没有一种方法可以强制转换以下内容:

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
extends
Number

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>