gpt4 book ai didi

java - 通配符声明的非显式泛型类型的泛型返回类型

转载 作者:行者123 更新时间:2023-11-30 10:31:17 24 4
gpt4 key购买 nike

想象一下这段代码:

public static <T> T[] superClassArray(Class<? extends T[]> subClass) {
T[] superArray = (T[]) Array.newInstance(subClass.getComponentType().getSuperclass(), 0);
return superArray;
}

此方法的返回类型 T[] 将是作为参数 subClass 给出的任何类型,即使认为 subClass 没有保证实际上表示 T[] 但只是一个子类 (? extends T)。所以实际的返回类型应该是 Object 因为 T[] 没有比 subclassany superclass 更明确地声明>.
然而,

Integer[] objA = superClassArray(Integer[].class);

编译是因为它被错误地期望返回一个 Integer[] 对象但显然抛出一个 ClassCastException 因为一个 Number[] 对象实际上是返回。

那么,仅通过相当模糊的通配符声明的泛型类型处理不当是否有正当理由,或者在我考虑的任何一点上都错了?

最佳答案

据我了解,您在尝试做的事情上不是很一致。使用您的方法,您正在创建一个类的 SUPERTYPE 数组,这实际上是成功的。

但是您试图将其分配给对非法 SUBTYPE 的引用。如果您确实确定此数组不能包含除 Integer 之外的任何其他类型的值,您可以显式转换它:

Integer[] objA = (Integer[]) superClassArray(Integer[].class);

但我看不出这样的代码有任何值(value),在现实世界中,如果你有一个任务要用这样的东西来解决,你真的应该多考虑几次,然后提出更好的解决方案。 :)

关于java - 通配符声明的非显式泛型类型的泛型返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43298028/

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