使用泛型参数和返回值定义的通用方法

时间:2012-07-22 12:19:25

标签: java generics java-ee methods parameters

  

可能重复:
  Calling constructor of a generic type

我想编写一个方法来检查null的anytype值,并相应地返回相同类型的值。我如何以通用方式编写它,以便我可以传递任何参数并返回相同的,如果它不是null或相同类型的新对象?

这样的事情会有所帮助,但显然下面不会有用:

public T getValue(T param) {
    if (null != param) {
        return param;
    } else {
        return ""; // or return new T
    }
}

1 个答案:

答案 0 :(得分:2)

您可以尝试明确传递默认值:

public <T> T valueOrDefault(T input, T fallback) {
    return input == null? fallback : input;
}

可以像:

一样使用
String query = valueOrDefault(getParameter("query"), "");

if (query.length() == 0) {

    ...
}

Java泛型(与C#相反)的问题是,编译后没有保留类型信息,这样就可以使new T()之类的东西工作。作为替代方法(如您对问题的评论中提出的那样),您可以传递类令牌:

public <T> T valueOrDefault(Class<T> token, T value) {
    if (value != null) return value;
    else {
        final Constructor<T> ctor = token.getConstructor();
        return ctor.newInstance();
    }
}

(为简洁省略了错误检查;代码未经过测试,甚至可能无法编译......)但这种方法非常脆弱。

  1. 如果T没有默认构造函数,该怎么办?
  2. 如果默认构造函数执行非常重要的操作会怎么样?
  3. 如果在使用默认构造函数构造后值不可用(因为需要额外的初始化),该怎么办?