0

我可以制作一个适用于特定类型的泛型类的方法吗?

例如,我在下面有我的课:

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

但这似乎不起作用。

关于如何做到这一点的任何想法或想法?

4

3 回答 3

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
   }

}

或按作文

public class MyLongArrayComposed {

   private MyArray<Long> myArray;

   public Long sumOfElms () {
      //code here
   }
}
于 2013-06-08T09:48:19.163 回答
0

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

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

在创建objectof 时MyArray使用以下代码:

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

更新 进一步,如果您想让您的方法根据类型工作,elms那么您可以按以下方式工作:

public void doSomething()
{
 if (elms instanceof Integer[])
 {
   ....
 }
}
于 2013-06-08T09:37:13.487 回答
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;
   }
}

用法一:

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;
于 2013-06-08T09:56:22.937 回答