java - Fluent Iterable 从包含泛型类的列表中进行数组

标签 java generics guava toarray

我有以下类结构:

abstract class Role;
class Employee extends Role;
class Student extends Role;
class Employer extends Role;

我还有一个枚举,在其中存储可接受的角色。

public enum RoleEnum
{
      EMPLOYEE ("Employee", Employee.class),
      STUDENT ("Student", Student.class), 
      EMPLOYER ("Employer", Employer.class);

      final private String name;

      final private Class<? extends Role> pRoleClass;

      private RoleEnum(final String name, final Class<? extends Role> pRoleClass)
      {
            this.name = name;
            this.pRoleClass = pRoleClass;
      }
}

我想要的是获取 Class<? extends Role> 类型的元素数组来自 RoleEnum 列表。我正在使用 Guava 库中的 FluentIterable,我想做的是类似 FluentIterable.from(list).transform(function).toArray(Class<? extends PartyRole>) 。然而我设法做的是一种解决方法和一种黑客攻击。它看起来像这样:

(Class<R>[]) FluentIterable.from(roles)
                        .transform(new Function<RoleEnum, Class<R>>()
                        {
                            @Override public Class<R> apply(final RoleEnum role)
                            {
                                return (Class<R>) role.getRoleClass();
                            }
                        })
                        .toList().toArray(new Class[0]));

哪里

class RoleComboWidget<R extends Role>

是我调用该方法的类,

ImmutableList<RoleEnum> roles;

最佳答案

您看到的是数组与泛型组合的效果。 Java 中的数组在运行时完全类型化:组件类型在运行时可用,加载/存储操作经过类型检查,可能会引发异常。

这要求组件类型可具体化的类型,但参数化类型如 RoleComboWidget<W>不是。泛型是通过编译时添加的不可见强制转换在 Java 中实现的,但是一旦程序运行,JVM 实际上不知道这是否是 List<String>List<Integer> .

回到你的问题,如果你控制着 API,那么在需要数组而不是 Collection(或 Stream)时要小心:很少有好处(通常在性能方面)胜过缺点(通常在源代码维护方面)。另外,请注意(编译已经警告您)强制转换为 SomeParameterizedType<T>[]始终未经检查:根据前面解释的内容,您最终可能会得到错误类型的对象,这可能会搞砸甚至停止您的程序。

关于java - Fluent Iterable 从包含泛型类的列表中进行数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871506/

相关文章:

java - java中的String hashCode是预先计算的吗?

Java 重用(静态?)对象作为临时对象以提高性能

java - HashingFunction 与 Arrays.hashCode 兼容

java - 如何使用TypeToken获取类型参数?

java - 在Java中如何从另一个类(不是继承)调用一个类?

java - 在Java中,PreparedStatement如何为以下查询工作

java - 对于类型T的方法,它的 'inferred'类型应该是什么当它需要两个<? super T> 争论?

c# - 将无穷大数学行为添加到 Decimal

swift - 使 Vapor API 响应符合 JSON API 规范

java - 在 Java 中存储枚举的顺序