如何设置列表的参考类型?

时间:2017-11-11 17:28:26

标签: java types casting

我是一名Java新手。我需要定义一个构造函数MyArrayList(Object type)来设置稍后要添加到列表中的引用类型。

构造函数签名无法更改。我也不允许使用泛型

我尝试这样做:

public class MyArrayList implements MyList {
private Object[] theList; // array of objects


public MyArrayList(Object type) {
    theList = new type[0];

}

并且因为type没有类而得到编译错误。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

Java中这种场景的答案是"泛型"。 java的官方documentation是了解泛型的好地方。

对于这种情况,您可以按如下方式编写代码

列表界面

package test.generics;

public interface MyList<T> {
    T get(int index);
    void add(T input);
    void clear();
}

实施

package test.generics;

public class MyArrayList<T> implements MyList<T> {

    private Object[] storage = new Object[10];
    private int index = 0;

    @SuppressWarnings("unchecked")
    @Override
    public T get(int index) {
        T temp = null;
        if (!(index < 10 && index >= 0)) {
            throw new IllegalArgumentException("Expected range 0 to 9");
        } else {
            temp = (T) storage[index];
        }
        return temp;
    }

    @Override
    public void add(T input) {
        if (index < 10) {
            storage[index++] = input;
        } else {
            throw new IllegalArgumentException("Only 10 items supported");
        }
    }

    @Override
    public void clear() {
        index = 0;
    }

}

消费者

package test.generics;

public class Consumer {

    public static void main(String[] args) {
        MyList<Integer> intList = new MyArrayList<>();
        intList.add(10);
        System.out.println(intList.get(0));
        MyList<String> stringList = new MyArrayList<>();
        stringList.add("hello");
        System.out.println(stringList.get(0));
    }

}

答案 1 :(得分:0)

正如您所说不希望使用泛型,您可以通过Array#newInstancedocumentation)动态创建数组。这是您调整后的代码:

public class MyArrayList implements MyList {
    private Object[] theList;

    public MyArrayList(Object type) {
        // Adjust as you like
        int size = 0;
        // Dynamically create array of type "type"
        theList = (Object[]) Array.newInstance(type.getClass(), size);
    }
}

由于您在编译时不知道该类,因此只能将其用作Object[],但是只有在运行时它才会允许type的真实类型的元素。已知,而非任意Object s。

请注意数组 固定大小。您不能只为它们添加元素,大小始终是固定的,必须事先知道。如果您需要更具动态性的结构,请使用List(例如ArrayListLinkedList)。

然后,您可以只记住给定的type对象,如果用户尝试添加项目,则检查element instanceof type并仅在返回true时添加,否则抛出异常IllegalArgumentException左右。

或者,如上所述,为您的阵列设置一个良好的固定大小。您还可以通过在构造函数中提供size参数来为用户提供该选择。