繁体   English   中英

有没有办法定义检查null然后创建对象的泛型方法?

[英]Is there a way to define a generic method that checks for null and then create the object?

我想编写一个方法来检查参数为null的位置,如果是,则返回该类型的新对象。 看起来像:

public static <T> T checkNull(T obj) {
    if (null == obj) return someHowCreateTheObjectWithTypeT();
    else return obj;
}

经过一番挣扎和挖掘,我仍然无法找到实现这一目标的方法,它在java中是否可能?

起初我想过反思。 但是,当对象为null时,我无法获取Class实例,并且如果没有类型T的名称,则无法创建Class ...

更新:

我想过将一个Class作为参数传递,但这不是最好的解决方案,如下面的答案所示:)

我的currunt解决方案是使用defaultValue参数:

public static <T> T checkNull(T obj, T defaultValue) {
    if (null == obj) return defaultValue;
    return obj;
}

这比反射解决方案更快更安全,并且是相同的冗长; 但是我必须为所有感兴趣的类型系统地指定一个DEFAULT_VALUE,这不是一件容易的事。

通用信息仅为编译时,在运行时不可用。 您必须将对象的Class作为提示传递,并且该类必须具有公共默认构造函数。 例如

public static T checkNull(Object o, Class<T> c) {
  try {
    return (o == null) ? c.newInstance() : o;
  } catch (Exception e) {
    return null;
  }
}

这是不可能的。 为了使泛型以这种方式工作,它必须在编译时捕获它将被调用的类型。 但是, null没有类型,因此您无法找出T来实例化它。

现在,您可以解决此问题,同时传递Class实例,但是您需要使用Reflection来进行一些相当强大的错误处理,以确保类型T是一个具体的类,并且具有可以调用的公共无参数构造函数。

无法做到。 您必须添加Class<T>的其他参数,然后将其用于反射新的。 类型T在编译过程中不存在。

正如其他人所指出的那样,这是不可能做到的。 但是, Guava提供的等效于您发布的方法的默认值:

String foo = Objects.firstNonNull(someString, "default");

这与您的方法略有不同,因为如果两个参数都为null ,则firstNonNull将抛出NullPointerException

另一个选择是创建一个使用Guava的Supplier<T>接口或类似方法的方法:

public static T firstNonNull(T first, Supplier<? extends T> defaultSupplier) {
  return first != null ? first : Preconditions.checkNotNull(defaultSupplier.get());
}

然后,您可以使用当且仅当第一个参数为null时创建并返回新默认实例的Supplier

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM