【问题标题】:Generic method defining with generic paramater and return value [duplicate]使用泛型参数和返回值定义的泛型方法
【发布时间】:2012-07-22 12:19:25
【问题描述】:

可能重复:
Calling constructor of a generic type

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

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

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

【问题讨论】:

标签: java generics jakarta-ee methods parameters


【解决方案1】:

您可以尝试显式传入默认值:

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() 这样的东西工作。作为一种替代方法(如 cmets 中针对您的问题提出的那样),您可以传入类令牌:

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. 如果某个值在使用默认构造函数构造后无法真正使用(因为需要额外的初始化)怎么办?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多