当前位置: 首页 > 知识库问答 >
问题:

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

漆雕彬彬
2023-03-14

这个问题与这个问题很接近,但有一个主要区别。

可能的要求:

(1) 我想生成一个带有通用返回值的Java函数。

(2)输入参数列表总是相同的。(

(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值=新的T() 也失败了。

有快速解决办法吗?还是不推荐这种方法?


共有3个答案

安承教
2023-03-14

从这个问题的答案和Angelika Langer的Java泛型FAQ中,您会发现无法检查泛型T的类型

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

传递类型参数:

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

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

鲜于裕
2023-03-14

你可以这样做:公共静态对象getValue(对象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;
}

或公共静态T getValue(对象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;
}
苏涵润
2023-03-14

由于泛型在运行时的类型擦除,您想要做的事情是不可能的。换句话说

可以通过这样的类对象来描述返回类型:

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

 类似资料:
  • 我试着写一个小函数,它接受两个列表,并根据另一个列表的元素对一个进行排序。所以类似于: 将产生一个排序列表。 然而,可能是一个不同的列表,比如整数、浮点数或其他列表。理想情况下,我希望我的程序能够获取我抛出的任何列表,根据

  • 我有一个问题,从抽象类中重写泛型方法。 这是我的抽象类: 当我创建类(B)来实现类(a)时,如下所示: 显示了(getData)方法中的以下编译错误: ”“B。getData“(“字符串函数(字符串)”不是“a”的有效重写。getData'('字符串函数(类型)‘)。dart(无效覆盖) 以及返回语句中的此错误: 类型为“String”的值不能从方法'getData'返回,因为它的返回类型为'St

  • 我为协变返回类型的继承创建了一个小示例。基本上有三种不同的类别: 主应用程序: BaseManager: 鸟经理: 当我重写方法以返回时,为什么我需要将类型转换为? 我使用过的重写方法在返回类型上会有所不同吗?作为参考。 编辑: 我有不同的子模型,它们都继承自。所有模型都允许存在一次。我尝试将这些模型添加到列表中,而不是对每个模型使用单例。使用,我想得到实际的模型。也许我得考虑太多了。

  • 我试图用Java中的一个通用返回类型来实现< code >命令模式。 在SO上查看了这个答案后,我创建了一个类(接口),如下所示: 然而,Eclipse一直抱怨: SearchResultsPage 类型的方法 execute(ArrayList, T) 必须重写或实现超类型方法 但当我点击 在超类型命令中创建 execute() Eclipse自动生成方法<code>T execute(Arra

  • 问题内容: 假设我有一个超类,它定义了以下抽象方法 现在,如果我想在某些子类中覆盖它 我收到有关类型安全和未经检查的转换的警告: 类型安全:返回类型为从类型需要选中转换,以符合从类型 没有下摔倒,如果?有什么办法可以适当消除警告吗? 问题答案: 重写方法的返回类型必须是重写方法的返回类型的子类型。 不是where 的子类型。T在这里未知。 是每个子类型化规则的的子类型。 有关通配符的一些子类型化规

  • 我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。