首先,我对java泛型没有太多经验。
我有一种这样的方法:
public static Set<Object> getObjects(Class<? extends Object> clazz) {
if (clazz == null) {
clazz = Object.class;
}
Set<Object> result = new HashSet<Object>();
Object object;
for (/*a loop*/) {
object = /*get an object*/;
if (clazz.isInstance(object)) {
result.add(object);
}
}
return result;
}
我认为最好使用泛型来获得正确的返回类型。所以我把方法改成了这样:
public static <T> Set<T> getObjects(Class<T> clazz) {
if (clazz == null) {
//what should I do instead? Throw exception?
}
Set<T> result = new HashSet<T>();
Object object;
for (/*a loop*/) {
object = /*get an object*/;
if (clazz.isInstance(object)) {//or should I use object instanceof T? If yes, I don't event use clazz. Would it be bad practice?
result.add((T) object);
}
}
return result;
}
我的问题:请参阅第二个代码中的注释。我应该在这里使用泛型吗?我用得对吗?你会怎么做?
最佳答案
首先,是的,如果 null 作为方法参数传递,您可能应该抛出 IllegalArgumentException 或 NullPointerException。
还有这一行
result.add((T) object);
可能应该使用 clazz 来进行 Actor 阵容。因为 T 被删除了,所以你在类型转换中得不到任何安全,并且可能会发生坏事(tm)。所以,它应该看起来像
result.add(clazz.cast(object));
此外,如果您使用 Java8,那么您可能会考虑使用流 API。假设您可以调用一些方法来返回“所有”对象的集合,那么您的方法将如下所示
public static <T> Set<T> getObjects(Class<T> clazz) {
if (clazz == null) {
throw new IllegalArgumentException();
}
return getAllTheObjects().stream()
.filter(clazz::isInstance)
.map(clazz::cast)
.collect(Collectors.toSet());
}
关于Java泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33972834/