Java I';我正在尝试创建一个可以同时接受整数和数组的arrayList

Java I';我正在尝试创建一个可以同时接受整数和数组的arrayList,java,generics,arraylist,Java,Generics,Arraylist,如何在Java中创建一个可以同时接受整数和数组的通用数组列表 [123,[],112,[],10] 好的,最快的方法可能是创建一个辅助对象,它由整数和数组组成,允许您通过相等的方式使用int(整数包装器)和数组的公共基类is object。所以使用对象类型创建 ArrayList<Object> list= new ArrayList<Object>(); ArrayList list=new ArrayList(); 但是这不是解决这个问题的正确方法,这里没有泛型

如何在Java中创建一个可以同时接受整数和数组的通用数组列表

[123,[],112,[],10]

好的,最快的方法可能是创建一个辅助对象,它由整数和数组组成,允许您通过相等的方式使用int(整数包装器)和数组的公共基类is object。所以使用对象类型创建

ArrayList<Object> list= new ArrayList<Object>();
ArrayList list=new ArrayList();

但是这不是解决这个问题的正确方法,这里没有泛型来保证运行时的安全性。因此,重新设计您的程序,并在单独的列表中分配每个类型,或者使用任何其他合适的类型。

使用一个具有
int
和数组作为其实例变量的类。然后创建一个
ArrayList
like

import java.util.ArrayList;

public class Hello {
    public static void main(String[]args) {
        ArrayList<Intarray> myArrayList = new ArrayList<Intarray>();

        int[] arr = {3,4,5};

        myArrayList.add(new Intarray(2,arr));
    }
}

class Intarray {
    private int numbers;
    private int[] myArray;

    public Intarray(int numbers, int[] myArray){
        this.numbers = numbers;
        this.myArray = myArray;
    }
}
import java.util.ArrayList;
公共课你好{
公共静态void main(字符串[]args){
ArrayList myArrayList=新建ArrayList();
int[]arr={3,4,5};
myArrayList.add(新的Intarray(2,arr));
}
}
类阵列{
私人整数;
私有int[]myArray;
公共数组(整数编号,整数[]myArray){
这个。数字=数字;
this.myArray=myArray;
}
}

在泛化级别为列表中需要的所有对象创建数组列表。在本例中,即对于int和array,它是java.lang.Object

下面是我运行的一个小测试:

public static void main(String[] args) {
    List<Object> both = new ArrayList<Object>();
    both.add(1);
    both.add(args);
    System.out.println(both);
}
publicstaticvoidmain(字符串[]args){
列出两者=新的ArrayList();
两者。加入(1);
添加(args);
System.out.println(两者);
}
产生:
[1,[Ljava.lang.String;@1db9742]

正如@AbtPst所建议的,最合适的解决方案是拥有一个列表列表。这可以通过许多不同的方式完成。就我个人而言,我会创建一个包含两个构造函数的类

class NumericElement
{
    private ArrayList<int> elements;

    public NumericElement(int newElement)
    {
        elements = new ArrayList<int>();
        elements.add(newElement);
    }

    public NumericElement(ArrayList<int> newElements)
    {
        elements = new ArrayList<int>(newElements); // copying array elements to the new array.
    }

    public ArrayList<int> getElements()
    {
        return elements;
    }
}
类数值元素
{
私有数组列表元素;
公共数值元素(int-newElement)
{
元素=新的ArrayList();
元素。添加(新元素);
}
公共数值元素(ArrayList新元素)
{
elements=newarraylist(newElements);//将数组元素复制到新数组中。
}
公共ArrayList getElements()
{
返回元素;
}
}

您可以使用类型安全接口定义
列表
,将不安全的
列表
隐藏为内部实现细节

<>这是比直接使用<代码>清单>代码>更有效的工作。如果你的列表只被一个类使用,只需使用<代码>列表>代码>作为一个类的实现细节。<强>但是如果你的列表被暴露在一个以上的类中,请考虑使用这种类型安全的方法。< /强>

public class ListOfScalarsAndArray extends AbstractList<IScalarOrArrayInt> {
    private static List<Object> m_list = new ArrayList<Object>();
首先,定义一个可以表示int或int数组的接口

public interface IScalarOrArrayInt { }
并为每个可能的元素类型定义子接口:

public interface IScalarInt extends IScalarOrArrayInt { 
    public int getScalarInt();
}

public interface IArrayInt extends IScalarOrArrayInt {
    public int[] getIntArray();
}
然后定义列表类及其表示形式。它的接口可以是
列表
表示形式可以是
列表
,这样您就可以直接将Integer和int[]对象放入其中,而无需包装对象。

public class ListOfScalarsAndArray extends AbstractList<IScalarOrArrayInt> {
    private static List<Object> m_list = new ArrayList<Object>();
为方便调用者,您可以添加一些接受未包装的
int
int[]
的方法。例如:

public void add( int element ) {
    m_list.add( element );
}

public void add( int[] element ) {
    m_list.add( element );
}
为了满足标准列表接口,您可以包装返回值。您的类控制内部列表,因此它单独控制可能的列表成员类型

private IScalarOrArrayInt wrap( Object o ) {
    if ( o instanceof Integer ) {
        final int i = (Integer) o;
        return new IScalarInt() {

            @Override
            public int getScalarInt() {
                return i;
            }
        };
    }
    else {
        assert( o instanceof int[] );

        final int[] a = (int[]) o;

        return new IArrayInt() {
            @Override
            public int[] getIntArray() {
                return a;
            }
        };
    }
}

只需创建对象并添加数组和整数…问题是什么?另一个简单的方法是将int视为一个包含一个元素的列表。这样,您就可以有一个列表。您可以告诉我们为什么需要它?虽然您可以使用
ArrayList
,但它可能表示一种设计味道。这将非常有用pful如果你添加一些代码来解释你的答案。虽然这是达到预期结果的一个好方法;这需要一个整数和一个数组,但我相信海报想要或者…不是两者都想要。