java - 枚举中来自供应商的无界通配符通用数组

标签 java generics enums java-8

我有一个枚举,它具有带泛型的构造函数。此构造函数期望 Class<T>Supplier<T[]>作为参数:

private <T> Foo(final Class<T> clazz, final Supplier<T[]> arg)

现在我想存储arg在枚举的成员变量中。因为枚举级别不支持泛型,所以我必须使用无限通配符:

public enum Foo {
    private final Supplier<?> arg;
}

构造函数的参数类型 ( Supplier<T[]> ) 与成员变量 ( Supplier<?> ) 不匹配。为此,我需要类似 Supplier<?[]> 的东西或 Supplier<? extends Array> .两者均无效。 Java 中是否有可能存储此通配符泛型数组?

所有这些都在一个枚举中:

public enum Foo {
    BAR(String.class, () -> new String[] { "A", "B", "C" });

    private final Class<?> clazz;
    private final Supplier<?> arg;
    // private final Supplier<?[]> arg;
    // private final Supplier<? extends Array> arg;

    private <T> Foo(final Class<T> clazz, final Supplier<T[]> arg) {
        this.clazz = clazz;
        this.arg = arg;
    }

    public Object[] getArgs() {
        return arg.get();
    }
}

最佳答案

我同意 ?[]感觉它应该是合法的代码。 (请参阅我几周前问过的类似问题 Arrays of unknown type)。

但是我被告知这是不必要的,因为您可以随时使用 Object[] .不像List s,数组是协变的,所以任何类型的对象数组都是 Object[] .

你可以使用 Supplier<? extends Object[]> 为了您的目的。

关于java - 枚举中来自供应商的无界通配符通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602141/

相关文章:

java - 第 k 大的时间复杂度

java - openOptionsMenu() 不适用于 appcompat-v7 22.1.0 或更新版本

swift - 泛型类中的变量获取错误类型

java - 属于特定类型的枚举

java - 如何检查uri指向的铃声是否存在?

java - 我已经尝试了所有可能的方法来使用 Webdriver 定位元素,但出现错误 "Unable to locate Element"

scala - 如何定义与更高种类类型绑定(bind)的上下文(类型构造函数)

java - 通过java泛型将pojo和dao类作为args传递并检索对象,需要一个动态泛型类来接受这些pojo并作为参数执行

c# - 有没有办法告诉我在运行时使用的是哪个枚举?

ruby-on-rails - Rails 迁移,从字符串转换为枚举