类中的getConstructors()中的泛型类型

安德烈·斯坦内克

在泛型类中,Class<T>该方法getConstructors()的返回类型具有未知的泛型类型参数,而不是T原因是javadoc中的explainend。

请注意,虽然此方法返回一个Constructor<T>对象数组(即此类的构造函数数组),但此方法的返回类型为Constructor<?>[]并且不是Constructor<T>[]预期的。这种信息量较少的返回类型是必需的,因为从此方法返回后,可以修改该数组以容纳不同类的Constructor对象,这将违反的类型保证Constructor<T>[]

我和我的一位同事试图理解这种解释。根据我们的理解,他们基本上是说它是未知的泛型类型,因为某些调用者可以将其他Constructor对象放入该数组中。我们说对了吗?如果是这样,为什么有人会以此方式设计API。使用特定类型并信任程序员可以正确使用数组会更好吗?对我们来说,这听起来有点像“我们正在开发更糟糕的API,因为使用它的程序员可能会尝试一些愚蠢的东西”。我们的谬论在哪里?

马可13

Ashu Pachauri在评论中提到的观点(即,返回数组是为了向后兼容)当然是有效的。通常,数组和泛型不能很好地配合使用。(作为证据,查找与“通用数组”相关的所有stackoverflow问题...)

此外,有一个规则,即API应该易于使用难以滥用在这种情况下,这与最小惊讶原则有关:使用此方法获得构造函数的人可以对返回的数组执行完全合法的操作序列,最后收到意外的ClassCastException因此,可以说Constructor<?>[]返回数组的事实旨在实现“快速失败”行为。

一个示例:

import java.lang.reflect.Constructor;

public class GetConstructorsReturnType
{
    public static void main(String[] args) throws Exception
    {
        // This causes a warning, due to the cast, but imagine
        // this was possible
        Constructor<DerivedA> constructorsA[] =
            (Constructor<DerivedA>[])DerivedA.class.getConstructors();

        // The following lines are valid due to the subtype
        // relationship, but would not be valid if constructorsA
        // was declared as "Constructor<?>"
        Constructor<? extends Base> constructors[] = constructorsA;
        constructors[0] = DerivedB.class.getConstructor();

        // This causes a ClassCastException (and would also not
        // be possible constructorsA was declared as "Constructor<?>"
        DerivedA instance = constructorsA[0].newInstance();
    }
}
class Base
{
}
class DerivedA extends Base
{
    public DerivedA()
    {
    }
}
class DerivedB extends Base
{
    public DerivedB()
    {
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

泛型方法和泛型类中的类型推断

来自分类Dev

类声明中的泛型类型

来自分类Dev

java类中的多个泛型类型

来自分类Dev

检查类中泛型类型是否为特定类型

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

在Typescript中的泛型类中初始化泛型类型

来自分类常见问题

从泛型类中的类型参数创建新对象

来自分类Dev

如何在泛型类中处理可为空的类型

来自分类Dev

如何从Java中的泛型类型推断类?

来自分类Dev

泛型类中的隐式类型参数

来自分类Dev

泛型类中特定于类型的静态

来自分类Dev

如何在泛型类中返回对象的泛型类型?

来自分类Dev

从类中获取泛型参数的类型,该类是从泛型接口继承的

来自分类Dev

如何在泛型方法中获取泛型类型的类实例

来自分类Dev

将动态类型的实例传递给泛型类中的泛型方法

来自分类Dev

c#获取泛型类中泛型类型参数的名称

来自分类Dev

泛型中的类型安全

来自分类Dev

Action中的泛型类型?

来自分类Dev

reactjs中的泛型类型

来自分类Dev

Scala中的泛型类型

来自分类Dev

动作中的泛型类型?

来自分类Dev

C ++中的泛型类

来自分类Dev

Java中的泛型类

来自分类Dev

在泛型类中实例化 Java 泛型类

来自分类Dev

在具有泛型类型的类中定义的数据类的类型提示

来自分类Dev

从泛型类型中获取属性类型

来自分类Dev

在类中声明类型参数时,Java泛型类型会丢失常量类型

来自分类Dev

如何使用主类中的方法从嵌套类中返回泛型类型