Java泛型方法

标签 java class generics methods return

首先,我对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/

相关文章:

java - 将具有托管属性的 JSF 转换为 CDI

java - UnsupportedOperationException - 此集合不支持 removeAll 方法(Java 集合)

java - 具有特定线程数的并行 for 循环

c++ - 子类作为类方法的返回类型

java - 如何声明通用处理程序的通用多类型集合

java - 为什么 T 在 Collections.max() 签名中受 Object 限制?

java - JPA 容器持久单元与 JPA 非容器持久单元

c++ - 如何在 C++ 中创建 "wrapper"?

c++ - 如何解决这个 C++ 多重继承类似问题

java - 将通用列表转换为非通用列表有什么影响?