Java:生成ArrayList中存储的对象类型的Array和ArrayList(作为参数传递到方法中)

Java:生成ArrayList中存储的对象类型的Array和ArrayList(作为参数传递到方法中),java,arrays,arraylist,arguments,instance,Java,Arrays,Arraylist,Arguments,Instance,爪哇: 我的方法的相关问题部分包括: public void createArrays(ArrayList<SomeClass> objectList) { SomeClass[] array = {objectList.toArray(new SomeClass[objectList.size()])}; ArrayList<SomeClass> = objectList; objectList.get(0).SomeClassInstanceM

爪哇:

我的方法的相关问题部分包括:

public void createArrays(ArrayList<SomeClass> objectList) {
    SomeClass[] array = {objectList.toArray(new SomeClass[objectList.size()])};
    ArrayList<SomeClass> = objectList;
    objectList.get(0).SomeClassInstanceMethod();
}
public void createArrays(ArrayList对象列表){
SomeClass[]数组={objectList.toArray(新的SomeClass[objectList.size()]);
ArrayList=对象列表;
get(0).SomeClassInstanceMethod();
}
  • 我有一个a类和B类对象的列表

  • 我的项目中的另一个类生成这些列表,然后将其中一个列表传递到createArrays(用于某些任务)

  • 除其他外,此方法创建SomeClass类型的数组和ArrayList(即A或B)•然后,在一个数组的元素上,createArrays调用A和B都具有的实例方法

    我尝试了许多组合,包括在参数ArrayList中获取0-index对象的类,但我永远无法创建未显式定义的类型的数组。我该怎么做

澄清:我试图(1)使数组的类型与参数数组的类型相同,我还想(2)从数组中调用元素的实例方法(这会产生问题,因为如果我使用超类,它不会调用像a和B这样的子类所特有的方法)


最终目标:我已经准备好了一系列不同类实例的列表,我想对它们执行完全相同的过程,所以这就是为什么我希望有一个方法对它传递的任何对象列表执行相同的操作。

您可以将
ArrayList
转换为
对象
数组

Object[] objectArr = objectList.toArray();
然后,如果要将对象数组中的元素返回到
SomeClass
中,请使用
instanceOf
方法检查它,并强制转换为
SomeClass
类型

if(objectArr[0] instanceOf SomeClass) {
  SomeClass instance = (SomeClass) objectArr[0];
}
或者,您可以将整个对象数组强制转换为SomeClass数组

  if (objectArr instanceof SomeClass[]) {
        SomeClass[] instances = (SomeClass[]) objectArr;
}
此外,您还可以尝试以下方法,将类类型作为参数传递给
getArray
方法

public <T> T getArray(Class<T> type, Object[] objectArr) throws Exception {

    T instances = type.cast(objectArr);
    return instances;
}
public T getArray(类类型,对象[]objectArr)引发异常{
T实例=type.cast(objectArr);
返回实例;
}

您是否尝试过使用界面来管理常用方法?这样,类A和类B就可以实现接口,并具有通用方法。通过首先使用instanceOf操作符和类型转换进行检查,您仍然可以访问类À或类B唯一的方法

interface CommonMethods {
    void method1();

    String commonMethod2(int argument);
} 

    class A implements CommonMethods {
        @Override
        void method1() {
            //write code
        } 
        //override remaining methods and declare other methods unique to class A
    } 

    class B implements CommonMethods {
        @Override
        void method1() {
            //write code
        } 
        //override remaining methods and declare other methods unique to class B
    } 

    //Somewhere in your other class that has the utility method
    public void createArrays(ArrayList<CommonMethods> objectList) {
        CommonMethods[] array = {objectList.toArray(new CommonMethods[objectList.size()])};
        //ArrayList<SomeClass> = objectList;//Consider revising this line. It's an error
        objectList.get(0).method1();//this method is common to A and B

        if (objectList.get(0) instance Of A) {
            A Var = (A) objectList.get(0);
            //call methods unique to A
        } 
    }
接口方法{
void方法1();
字符串commonMethod2(int参数);
} 
类实现公共方法{
@凌驾
void method1(){
//编写代码
} 
//重写其余方法并声明类A唯一的其他方法
} 
类B实现公共方法{
@凌驾
void method1(){
//编写代码
} 
//重写其余方法并声明类B唯一的其他方法
} 
//在您的另一个类中具有实用程序方法的某个地方
公共void createArrays(ArrayList对象列表){
CommonMethods[]数组={objectList.toArray(新的CommonMethods[objectList.size()]);
//ArrayList=objectList;//考虑修改此行。这是一个错误
objectList.get(0.method1();//此方法对于A和B是通用的
if(objectList.get(0)的实例){
A Var=(A)objectList.get(0);
//调用特定于
} 
}

祝您好运

您可以通过让
A
B
子类实现一个接口来实现您想要的结果:

interface I { 
    void doSomthing(); //the common instance method 
}

class A implements I{

    @Override
    public void doSomthing() {
        System.out.println("A is doing something");
    }
}

class B implements I{

    @Override
    public void doSomthing() {
        System.out.println("B is doing something");
    }
}
调用所有objectList元素的
doSomthing()

public static void useList(List<? extends I> objectList) {

    for( I object : objectList) {
        object.doSomthing();
    }
}

public static void useList(列表)你的问题不清楚,你到底想实现什么?预期的输出是什么?这是我的类的简化版本,因为有太多的上下文让人难以理解。我试图(1)制作与参数数组类型相同的数组,我还想(2)从数组中调用元素的实例方法(这会产生问题,因为如果我使用超类,它不会调用像a和B这样的子类所特有的方法)@JohnDoe将澄清作为对您的问题的编辑而不是评论。讨论您的最终目标,您的目的,可能会得出更好的解决方案。如果您是面向对象编程的新手,您可能从错误的角度来处理问题。如果您想在不同类的实例上运行相同的过程,那么这些对象必须有一个共同点:您想要运行的过程。如果是这样,各个类都应该声明它们实现了您定义为具有特定过程(方法)的接口。有没有办法只执行一次?我不想重复完全相同的代码来更改类的名称。可能将类作为变量使用?您可以尝试我发布的最后一个方法吗?它突出显示类参数类型的名称,并显示“找不到符号-类t”。它还突出显示声明语句的T类型。
objectList.get(0)由于多态性,不需要一个
实例。另外:
CommonMethods
的实现需要是公共的,
objectList。toArray
需要强制转换。只有在实现类位于不同的包中时,声明才需要是公共的。此外,还需要检查CommonMethod所指向的类od的归属是为了调用特定于该类的方法(ListThis解释说,只有当实现类位于不同的包中时,公共访问器才是必需的。此外,从代码附带的注释中可以看出,无论类的具体类型如何,都可以执行接口中的方法。只有特定类所特有的方法不能这样执行。如果您的代码s不是编译w
@SuppressWarnings("unchecked")
public static <T> T[] createArray(Class<T> c, int s) {

    return (T[]) Array.newInstance(c, s);
}
public static void main(String[] args) {
    //create test list 
    List<A> aList = new ArrayList<>();
    aList.add(new A());

    //make array of type A
    I[] array = createArray(aList.get(0).getClass(), aList.size());
    //check array type 
    System.out.println("The class of array is "+ array.getClass());
    //run A.doSomething()
    useList(aList); //output : A is doing something
}