【问题标题】:Making this template class into a generic class使这个模板类成为一个泛型类
【发布时间】:2012-10-31 15:49:42
【问题描述】:

所以我是一名大学生,只是想寻求一点帮助和理解,我有一位教授不允许我们使用 ArrayList 等 java 预先编写的类,所以我想弄清楚如何修改我当前的封装数组类以使用泛型,这样我就不必在我的程序的应用程序类中做太多的转换

public class ArrayClass {
    private Object[]  objArray;
    private int index = 0;
    public static final int MAX_SIZE = 100;

    public ArrayClass(){
        objArray = new Object[100];
    }

    public ArrayClass(int numSlots){
        objArray = new Object[numSlots];
    }
    public ArrayClass(Object[] anArray, int newIndex){
        objArray = new Object[newIndex];
        for(int i=0; i<newIndex; i++){
            objArray[i] = anArray[i];
        }
        index = newIndex;
    }


    //return object array, accessor
    public Object[] getstrArr(){
        return objArray;
    }
    //return # of actual data in array, accessor
    public int getIndex(){
        return index;
    }
    //return an object at given pos, accesor
    public Object getObject(int pos){
        return objArray[pos];
    }


    //assign a new object array, mutator
    public void setObjArr(Object[] aStrArr){
        for(int i=0; i<index; i++){
            objArray[i] = aStrArr[i];
        }
    }
    //assign a new index, mutator
    public void setIndex(int anIndex){
        index = anIndex;
    }
    //insert a new string into the array if there is room, increment index
    public void add(Object someObj){
        if(index < objArray.length){
            objArray[index] = someObj;
            index++;
        }
    }

    //return the string with contents of array
    public String toString(){
        String output = " ";
        for(int i=0; i<index; i++){
            output = output + objArray[i].toString();
        }
        return output;
    }

    //return true if calling object is equivalent to argument
    public boolean equals(Object someObj){
        for(int i=0; i< index; i++){
            if(objArray[i].equals(someObj))
                return true;
        }
        return false;
    }
}

【问题讨论】:

  • 不允许使用arrayList,因为老师认为我们需要更多地了解如何操作列表,但更重要的是因为她只是讨厌生活,我想。
  • 哈哈哈大概吧。这个限制实在是太傻了,你可以在网上查一下 ArrayList 的实现,复制一下就行了。

标签: java generics template-classes


【解决方案1】:
public class ArrayClass<E> {

// return object array, accessor
public <T> T[] getstrArr(T[] t) {<--This is done because arrays are covarant in nature    
       return (T[]) Arrays.copyOf(objArray, index, t.getClass());
    }

 // return an object at given pos, accesor
public E getObject(int pos) {<-- For single elements just return E with casting
    return (E) objArray[pos];
}

实施说明

  1. 应考虑对Arrays.copy 进行长度检查
  2. 您可以阅读一篇关于generics 的好文章

【讨论】:

  • 这很酷,但是我该如何正确声明我的数组?
  • 数组将保持不变,即Object[] 您不能创建通用数组。唯一的方法是进行类型转换,但首选其他方法
【解决方案2】:

好吧,我不会使用 setIndex 等方法公开您的索引。也不会添加空元素检查。

无论如何,我会做这样的事情:

public class ArrayClass<E> {
    ...
    private E[] elements;
    private int index;
    ...
    public ArrayClass() {
        this.elements = (E[]) new Object[MAX_SIZE];
        this.index = 0;
    }
    // this constructor substitutes the method setObjArr
    public ArrayClass(E[] elements) {
        this.elements = elements;
        this.index = elements.length;
    }
    ...
    public void add(E element) {
        if (needsToGrow()) {
            duplicateArraySize();
        }
        this.elements[index++] = element;
    }
    private boolean needsToGrow() {
        return index + 1 == elements.length;
    }
    private void duplicateArraySize() {
        E[] extendedArray = (E[]) new Object[this.elements.length * 2];
        System.arraycopy(elements, 0, extendedArray, 0, elements.length);
        this.elements = extendedArray;
    }
    public E get(int index) {
        return this.elements[index];
    }
    public int size() {
        return this.index;
    }
    ...
}

【讨论】:

    【解决方案3】:

    我会这样做:

    public class ArrayClass<T> {
      public T[] objArray;
      private int index = 0;
      public static final int MAX_SIZE = 100;
    
      @SuppressWarnings("unchecked")
      public ArrayClass(Class<T> c) {
        objArray = (T[]) Array.newInstance(c,MAX_SIZE);
      }
    }
    

    等等。

    然后:

    ArrayClass<String> myStringArray = new ArrayClass<String>(String.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多