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;