Java泛型返回类型(具有类似的输入参数)

时间:2016-05-25 07:01:41

标签: java generics

这个问题接近this,但存在重大差异。

五月要求:

(1)我想生成一个具有泛型返回值的Java函数。

(2)输入参数列表始终相同。 (与link above不同)。

(3)函数应知道,期望返回参数的类型。

我的尝试:

public  <T> T getProperty(String name)
    { 
        T value;
        try {
            if (T instanceof String) {value = (T) getStringProperty(name);}
            if (T instanceof Long) {value = (T) getLongProperty(name);}
            if (T instanceof Boolean) {value = (T) getBooleanProperty(name);}           
        } catch (Exception e) {
            LOGGER.error("error at getProperty", e);

        }
        return value;
    }

这不起作用,因为没有生成T的实例。 T value = new T();的试验也失败了。

有什么快速解决方法吗?或者不推荐这种方法?

3 个答案:

答案 0 :(得分:4)

由于运行时type erasure泛型,因此无法执行此操作。换句话说,在您的情况下,<T>将被删除为Object

您可以像这样传递一个Class-Object来描述返回类型:

public  <T> T getProperty(Class<T> returnType,String name){
   if (returnType == String.class)
       return (T)stringProperty(name);
   [...]
}

答案 1 :(得分:0)

this questionAngelika Langer's Java Generics FAQ的答案中,您会发现您无法检查通用T的类型

所以你要做的就是在方法中传递类型参数或更改你的代码设计。

传递类型参数:

public  <T> T getProperty(Class<T> returnType, String name){
    if (returnType == String.class)
        return (T)stringProperty(name);
    [...]
}

或直接调用getStringProperty()getLongProperty()等方法,而不是调用getProperty()泛型方法。

答案 2 :(得分:0)

你可以这样做: public static Object getValue(Object str){

     if(str instanceof String){
          return   str;
     } if(str instanceof Integer){
          return   str;
     } if(str instanceof Long){
          return   str;
     } if(str instanceof Double){
          return   str;
     } if(str instanceof Float){
          return   str;
     } if(str instanceof BigDecimal){
          return  str;
     }

     return null;
}

或 public static T getValue(Object str){

     if(str instanceof String){
          return  (T) str;
     } if(str instanceof Integer){
          return  (T) str;
     } if(str instanceof Long){
          return  (T) str;
     } if(str instanceof Double){
          return  (T) str;
     } if(str instanceof Float){
          return  (T) str;
     } if(str instanceof BigDecimal){
          return  (T) str;
     }

     return null;
}