[英]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.