我是一名Java新手。我需要定义一个构造函数MyArrayList(Object type)
来设置稍后要添加到列表中的引用类型。
构造函数的签名无法更改。我也不允许使用泛型。
我尝试这样做:
public class MyArrayList implements MyList {
private Object[] theList; // array of objects
public MyArrayList(Object type) {
theList = new type[0];
}
并且因为type
没有类而得到编译错误。这样做的正确方法是什么?
答案 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#newInstance
(documentation)动态创建数组。这是您调整后的代码:
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
(例如ArrayList
或LinkedList
)。
然后,您可以只记住给定的type
对象,如果用户尝试添加项目,则检查element instanceof type
并仅在返回true
时添加,否则抛出异常IllegalArgumentException
左右。
或者,如上所述,为您的阵列设置一个良好的固定大小。您还可以通过在构造函数中提供size
参数来为用户提供该选择。