Java中的Cast ArrayList
我用的是两节课Java中的Cast ArrayList,java,Java,我用的是两节课 Class TestClassOne{ //Some methods //Some methods //Some methods } Class TestClassTwo extends TestClassOne{ //Some Variable //Some Variable //Some Variable } 现在我有了TestClassOne对象,可以转换为TestClass2 TestClassOne classOne = new TestClassOne(); T
Class TestClassOne{
//Some methods
//Some methods
//Some methods
}
Class TestClassTwo extends TestClassOne{
//Some Variable
//Some Variable
//Some Variable
}
现在我有了TestClassOne对象,可以转换为TestClass2
TestClassOne classOne = new TestClassOne();
TestClassTwo classTwo = (TestClassTwo)classOne;
我能为ArrayList做同样的事情吗?
比如说
ArrayList<TestClassOne> testList1 = new ArrayList<>();
ArrayList<TestClassTwo> testList2 = (ArrayList<TestClassTwo>) testList1;
但我得到的错误,不能投。有没有其他方法来投出ArrayList 您可以使用泛型类
class TestClassOne<T>
{
}
class TestClassTwo
{
}
像这样铸造
List<TestClassOne<TestClassTwo>> list = new List<TestClassOne<TestClassTwo>>();
你不能。不支持具有类型参数的继承 而是创建一个静态帮助器方法,该方法将迭代列表中的一个元素,并强制转换每个元素,然后返回新列表。e、 g
public static convert(ArrayList<ClassOne>) {
ArrayList<ClassTwo> b = new ArrayList<ClassTwo>();
forEach(classOne) {
b.add((ClassTwo)classOne);
}
return b;
}
简单的强制转换TestClassOne->TestClass2将不起作用,除非testList1集合包含TestClass2的实例,并且只包含它们
您想要实现的强制转换是不可能的,因为即使TestClass2扩展了TestClass1,也无法保证该类TestClass2会有一个足够的构造函数。TestClass2可能有额外的变量,JVM不知道如何处理这些变量。正如你所看到的,这对人类来说也是个问题
==========================================================================
以其他方式铸造是可能的。因为TestClass2将具有与TestClassOne相同的方法,因为它扩展了它
==========================================================================
如果希望将TestClassOne和TestClassII的元素保存在同一个集合中,则可以使用通用通配符:
List<? extends TestClassOne> testList1 = new ArrayList<>();
==========================================================================
另一个解决方案是在TestClass2中使用适配器构造函数。它将接受TestClassOne作为参数,并根据需要选择性地插入其他参数。TestClassTwo对象的创建应由您管理
class TestClassTwo extends TestClassOne{
TestClassTwo(TestClassOne in) {...}
}
然后您可以使用simply adapt:
List<TestClassOne> testList1 = new ArrayList<>();//add some arguments
List<TestClassTwo> testList2 = testList1.stream().map(TestClassTwo::new).collect(toList());
泛型类型不能像那样相互转换。即使B从A继承,T也不能强制转换为T 在这种情况下,您可以对数组列表中的每个元素进行强制转换,并使用这些元素创建新的数组列表
ArrayList<TestClassTwo> testList2 = testList1.stream().map(x -> (TestClassTwo)x)
.collect(Collectors.toCollection(ArrayList::new))
显然,只有当数组列表中存储的对象实际上都是TestClass2的实例时,这才有效。TestClassOne classOne=new TestClassOne;TestClassTwo classTow=TestClassTwoabstractProfile-您是否打算转换classOne?是的。现在编辑我的问题。我很惊讶你能做TestClassTwoClassTow=TestClassTwoclassOne;你确定TestClassTow没有扩展TestClassOne吗?没有继承你怎么能强制转换??我很惊讶。请提供更详细的代码片段,否则会出现编译错误
TestClassOne classOne = new TestClassOne();
TestClassTwo classTwo = (TestClassTwo)classOne;