私はリフレクションによってメソッドを呼び出しています。その戻り値の型は汎用です。戻り値をnullにしたくないので、その場合はその汎用型のデフォルト値を割り当てる必要があります。
つまり、リフレクションでメソッドを呼び出すと した後、次のようなコードを実行します。
T resultNotNull = (T) reflectionMethodThatCanReturnNull.invoke(anObject);
// If it's null, let's assign something assignable.
if (resultNotNull == null) {
if (resultNotNull.getClass().isAssignableFrom(Long.class)) {
resultNotNull = (T) Long.valueOf(-1);
} else if (resultNotNull.getClass().isAssignableFrom(String.class)) {
resultNotNull = (T) "NOTHING";
}
}
もちろん、 'resultNotNull == null'の場合、例外を取得せずに 'resultNotNull.getClass()'を呼び出すことはできません。
ジェネリックタイプに応じてデフォルト値を割り当てる方法に関するアイデアはありますか?
コード全体は次のようなものになります。
public class ReflectionTest {
public class Class1ok {
public Long method() { return Long.valueOf(1); }
}
public class Class1null {
public Long method() { return null; }//It returns null
}
public class Class2ok {
public String method() { return "SOMETHING"; }
}
public static void main(String[] args) {
ReflectionTest test = new ReflectionTest();
Long notNullValue1
= test.methodReturnNotNull(Class1ok.class);//1
Long notNullValue2
= test.methodReturnNotNull(Class1null.class);//-1, not null
String notNullValue3
= test.methodReturnNotNull(Class2ok.class);//"SOMETHING"
}
public T methodReturnNotNull(Class theClass) {
T resultNotNull = null;
try {
Object theObject = theClass.newInstance();
Method methodThatCanReturnNull = theClass.getMethod("method");
resultNotNull = (T) methodThatCanReturnNull.invoke(theObject);
} catch (Exception e) {
//Meh.
}
//If it's null, assign something assignable.
if (resultNotNull == null) {
if (resultNotNull.getClass().isAssignableFrom(Long.class)) {
resultNotNull = (T) Long.valueOf(-1);
} else if (resultNotNull.getClass().isAssignableFrom(String.class)) {
resultNotNull = (T) "NOTHING";
}
}
return resultNotNull;
}
}