gpt4 book ai didi

java - Java 中 Class 类型的可变参数

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:05 24 4
gpt4 key购买 nike

例如,如果我有一个方法,该方法对扩展父类(super class)的类类型使用可变参数,例如这个:

public static <E extends Example> void test(Class<E>... es){}

然后我尝试用 Example 的两个不同子类调用该方法,只有在创建一个包含两个类的数组时我才能这样做。

//this does not work
test(E1.class,E2.class);
//this does work
test(new Class[]{E1.class,E2.class});
public class E1 extends Example {}
public class E2 extends Example {}

这是为什么?

最佳答案

这一行不编译:

test(E1.class,E2.class);

只有一个类型参数E , 并且 Java 必须与参数的推断类型完全匹配。它无法推断 Example ,因为对象是 Class<E1>Class<E2> , 不是 Class<Example> . Java 泛型的不变性阻止了这种情况的发生。

您可以通过在 test 上引入上限通配符来解决此问题的泛型类型参数:

public static <E extends Example> void test(Class<? extends E>... es)

这允许 Java 推断 Example对于 E , 通过用 E1 满足上限通配符和 E2 .

第二行创建了一个原始数组 Class es,绕过泛型并生成“未检查的调用”警告。

new Class[]{E1.class,E2.class}

如果您尝试向 Class 提供类型参数在这里,你会得到任何半路合理类型参数的编译器错误:

// Needs Class<Example> but found Class<E1> and Class<E2>
test(new Class<Example>[]{E1.class,E2.class});

// Needs Class<E1> but found Class<E2>
test(new Class<E1>[]{E1.class,E2.class});

// Needs Class<E2> but found Class<E1>
test(new Class<E2>[]{E1.class,E2.class});

在这里使用通配符来满足推理只是揭示了这里的真正问题——通用数组创建。

// Generic array creation
test(new Class<? extends Example>[]{E1.class,E2.class});

关于java - Java 中 Class 类型的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26170318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com