Java - 特定通用实例的实例方法

时间:2013-06-08 09:30:04

标签: java types generics

我可以创建一个适用于特定类型泛型类的方法。

例如,我的课程如下:

package utils;

public class MyArray<T> {
    // Constants
    private static final int INITIAL_SIZE = 10;

    // Instance Fields
    private T[] elms;
    private int size;

    // Constructor
    public MyArray () {
        elms = (T[]) new Object[INITIAL_SIZE];
        size = 0;
    }

    // Methods
    public void add (T elm) {
        if (elms.length == size)
            increaseSize();

        elms[size++] = elm;
    }

    @Override
    public String toString () {
        String str = "[" + elms[0];

        for (int i = 1; i < size; i++)
            str += ", " + elms[i];

        str += "]";

        return str;
    }

    // Helper Methods
    private void increaseSize () {
        T[] temp = (T[]) new Object[elms.length];
        for (int i = 0; i < temp.length; i++)
            temp[i] = elms[i];

        elms = (T[]) new Object[2 * temp.length];

        for (int i = 0; i < temp.length; i++)
            elms[i] = temp[i];
    }
}

我可以创建一个适用于MyArray<Integer>MyArray<Long>的方法,并在其他类型上引发异常吗?

我尝试了以下操作:

public T sumOfElms () {
    if (T instanceof Integer) {
        // code here
    }
}

但它似乎不起作用。

关于我如何做到的任何想法或想法?

3 个答案:

答案 0 :(得分:1)

喜欢@Vishal K解决方案

  

您可以通过以下方式更改构造函数:

    public MyArray (Class<T> clazz) {
       elms = (T[])java.lang.reflect.Array.newInstance(clazz,INITIAL_SIZE);
       size = 0;
    }
     

在创建MyArray的对象时,请使用以下代码:

    MyArray<Integer> myArray = new MyArray<Integer>(Integer.class);

你想在泛型类中创建这个非泛型方法,所以你必须采取其他策略,instanceof很难看。

public T sumOfElms () {
    if (T instanceof Integer) {
        // code here
    }
}

你必须扩展这个类以具有像这样的功能(继承或组合)

public class MyLongArray extends MyArray<Long> {

   public Long sumOfElms () {
      //code here
   }

}

或通过Composition

public class MyLongArrayComposed {

   private MyArray<Long> myArray;

   public Long sumOfElms () {
      //code here
   }
}

答案 1 :(得分:0)

您可以通过以下方式更改构造函数:

public MyArray (Class<T> clazz) {
    elms = (T[])java.lang.reflect.Array.newInstance(clazz,INITIAL_SIZE);
    size = 0;
}

在创建object的{​​{1}}时,请使用以下代码:

MyArray

<强>更新 此外,如果您希望根据MyArray<Integer> myArray = new MyArray<Integer>(Integer.class); 的类型使您的方法有效,那么您可以按以下方式工作:

elms

答案 2 :(得分:0)

public class MyArray<T> {

   ...

   private T[] elms;
   private int size;

   ...
   public boolean forEach( ArrayItemFct<T> fct ) {
      for( T t item ) {
         if( ! fct( item )) {
            return false;
         }
      }
      return true;
   }
}

class Summation extends ArrayItemFct<Integer> {

   public long sum = 0L;

   @Override boolean fct( Integer item ) {
      this.sum += item;
   }
}

用法1:

MyArray< Integer > array = new MyArray<>();
... // add items
Summation summation = new Summation();
array.forEach( summation );
long sum = summation.sum;

用法2:

MyArray< String > array = new MyArray<>();
... // add items
Concatenation concatenation = new Concatenation();
array.forEach( concatenation );
String concat = concatenation.concat;