Java 将默认值指定给泛型
我通过反射调用一个方法,它的返回类型是泛型的。我不希望返回值为null,因此在这种情况下,我希望指定该泛型类型的默认值 也就是说,在通过反射调用方法之后,我想执行如下操作:Java 将默认值指定给泛型,java,generics,reflection,default-value,Java,Generics,Reflection,Default Value,我通过反射调用一个方法,它的返回类型是泛型的。我不希望返回值为null,因此在这种情况下,我希望指定该泛型类型的默认值 也就是说,在通过反射调用方法之后,我想执行如下操作: T resultNotNull = (T) reflectionMethodThatCanReturnNull.invoke(anObject); // If it's null, let's assign something assignable. if (resultNotNull == null) { if (
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";
}
}
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> 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;
}
}
但是,当然,如果'resultNotNull==null',我们不能调用'resultNotNull.getClass()'而不得到异常
关于如何根据泛型类型指定默认值,有什么想法吗
整个代码如下所示:
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";
}
}
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> 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;
}
}
公共类ReflectionTest{
公开课:好的{
公共Long方法(){return Long.valueOf(1);}
}
公共类ClassNull{
公共长方法(){return null;}//它返回null
}
公共类Class2ok{
公共字符串方法(){return“SOMETHING”;}
}
公共静态void main(字符串[]args){
ReflectionTest=新的ReflectionTest();
长notNullValue1
=test.methodReturnNotNull(classOK.class);//1
长非空值2
=test.methodReturnNotNull(ClassNull.class);/-1,非null
字符串notNullValue3
=test.methodReturnNotNull(Class2ok.class);/“某物”
}
公共T methodReturnNotNull(类){
T resultNotNull=null;
试一试{
对象theObject=class.newInstance();
MethodMethodThatCanReturnNull=class.getMethod(“方法”);
resultNotNull=(T)可以返回null.invoke(对象)的方法;
}捕获(例外e){
//嗯。
}
//如果为空,则分配可分配的内容。
if(resultNotNull==null){
if(resultNotNull.getClass().isAssignableFrom(Long.class)){
resultNotNull=(T)Long.valueOf(-1);
}else if(resultNotNull.getClass().isAssignableFrom(String.class)){
resultNotNull=(T)“无”;
}
}
返回resultNotNull;
}
}
您可以使用getReturnType()
private static final Map replacementForNull=new HashMap();
静止的{
replacementForNull.put(String.class,“NOTHING”);
replacementForNull.put(Long.class,1L);
}
方法reflectionMethodThatCanReturnNull=。。。
T resultNotNull=(T)reflectionmethodhattcanreturnnull.invoke(anObject);
//如果它为null,那么让我们分配一些可分配的内容。
if(resultNotNull==null){
类returnType=reflectionMethodThatCanReturnNull.getReturnType();
resultNotNull=replacementForNull.get(returnType);
}
为什么您的T
无法实现某些接口或扩展某些基类?然后您可以从T
调用一些静态默认方法,该方法返回给定类T
的默认值。赞成的意见?它将把您的开关
代码封装到正确的类中
当然,如果没有任何接口,所有可能的
T
类都可以有一些方法,比如getDefaultValue()
getReturnType()不会返回对象吗?泛型在编译时被擦除。如果返回类型是Object或返回Object的泛型,则getReturnType()将返回Object。在上面的例子中,它将是长的和字符串的。好吧,我误读了这个问题,我认为他的意思是方法“method”是泛型的。正如Peter Lawrey指出的,答案是使用getReturnType()
:T resultNotNull=(T)reflectionMethodThatCanReturnNull.invoke(anObject);//如果它为null,那么让我们分配一些可分配的内容。if(resultNotNull==null){final Class returnType=methodGetFkForIncidentTo.getReturnType();if(returnType.isAssignableFrom(Long.Class)){resultNotNull=(T)Long.valueOf(-1);}否则if(returnType.isAssignableFrom(String.Class)){resultNotNull=(T)“NOTHING”;}使用地图可能更优雅。请参见上文。否,我无法更改t类以添加getDefaultValue()
方法,也无法更改它们返回的内容。