0

可能重复:
调用泛型类型的构造函数

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

这样的事情会有所帮助,但显然以下内容不起作用:

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

1 回答 1

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. 如果一个值在使用默认构造函数构造后不能真正使用(因为需要额外的初始化)怎么办?
于 2012-07-22T12:57:26.163 回答