2017-11-11 48 views
1

我是一个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

完全使用泛型和构造函数。 – luk2302

+0

*“并得到一个编译错误”* - 总是发布我们所得到的完整错误。否则,你会将观众缩小到立即知道问题出在哪里的人。 – Zabuza

+0

@abovady如果用户回答你的问题,请也接受他的回答([接受答案:它是如何工作的?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作))。如果不是,那么请说明还没有答案,这是StackOverflow的重要组成部分,非常感谢。 – Zabuza

回答

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参数给用户。

+0

谢谢,我试图实现你的解决方案,但是当我动态创建一个数组时,我得到了一个编译器错误“类型不匹配”。 'newInstance'返回一个Object,'theList'是Object []。 – abovady

+0

@abovady由于该方法返回的是Object而不是数组(但实际的类型实际上是数组),所以我编辑了代码并将一个强制类型添加到Object []中。你可以再试一次吗? – Zabuza

+0

谢谢,它的工作。我的数组的大小很灵活。如果添加的元素超出边界,则将数组添加到数组的末尾。我通过创建一个长度为+1的新数组并将旧数组的内容复制到一个新数组中来完成。 – abovady

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)); 
    } 

} 
+0

我了解您的解决方案,但我不允许使用类型参数。我必须使用带有我描述的签名的构造函数。 – abovady