Java 将默认值指定给泛型

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 (

我通过反射调用一个方法,它的返回类型是泛型的。我不希望返回值为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";
    } 
}
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()
方法,也无法更改它们返回的内容。