我可以创建一个适用于特定类型泛型类的方法。
例如,我的课程如下:
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
}
}
但它似乎不起作用。
关于我如何做到的任何想法或想法?
答案 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;