代码之家  ›  专栏  ›  技术社区  ›  Laird Nelson

在Java语言规范版本11第4.10.2节中,包含通配符的参数化类型是否没有直接超类型?

  •  0
  • Laird Nelson  · 技术社区  · 4 年前

    the Java Language Specification, version 11, section 4.10.2 ,在讨论参数化类型的直接超类型时,部分内容如下:

    给定泛型类型声明C<F、 ,F>(n>0),参数化类型C<T、 ,T>, 式中,Tá(1·i·n)是一个类型 ,是以下所有项目:

    (然后列出了一系列适用于此类参数化类型的规则。这些规则与此问题基本无关。它们的相关性仅在于它们为某些参数化类型定义了直接超类型。)

    at the top of section 4.1 :

    Java编程语言中有两种类型:基元类型(§4.2)和引用类型(§4.3)。

    is simply a ClassOrInterfaceType , a TypeVariable or an ArrayType .

    因此,通配符不是一种类型。

    (It) is, in fact, a kind of TypeArgument . 你可能会像我曾经做的那样,模糊而天真地认为通配符是一种不可靠的密码 ,因此是一种类型,但 you would be incorrect .)

    综上所述,我对第4.10.2节相关部分的理解是:

    • “参数化类型C<T,,T>,其中Tá(1·i·n)是一种类型”具有各种类型的直接超类型
    • 参数化类型C<T、 ,T>,其中至少有一个T是通配符 直接超型
      • 因为本节中列出的规则不完全或部分应用于包含至少一个通配符的参数化类型
        • 因为通配符不是一种类型,所以“where Tá(1·i·n)是一种类型”的条件永远不会满足。

    (顺便提一下,可能值得注意的是,有些类型可以“包含”包含通配符的参数化类型(如 defined in section 4.5.1 ).)

    1 回复  |  直到 4 年前
        1
  •  3
  •   Sweeper    4 年前

    您引用的部分实际上没有说明至少有一个通配符类型参数的参数化类型。其直接超级类型是在您引用的零件之后指定的:

    给定泛型类型声明C<F1,…,Fn>(n>0),参数化类型C<R1,…,Rn>其中至少一个Ri(1·i·n)是通配符类型参数,是参数化类型C<X1,…,Xn>这是将捕获转换应用于C<R1,…,Rn>( §5.1.10 ).

        2
  •  1
  •   James-Jesse Drinkard    4 年前

    通配符是JAVA中的类型,它们是“存在类型”。从同一链接页面:

    通配符与已建立的类型理论的关系是一个重要的概念 有趣的一个,我们在这里简要地提到。通配符是一种 存在类型的限制形式。给定泛型类型声明 G、 G<&燃气轮机;大致类似于某些X<:B.G。

    原始类型与通配符密切相关。两者都是基于 存在类型。原始类型可以被认为是通配符,其类型 在GJ中介绍,并在文章中描述了如何确保未来的安全 过去:通过 Gilad Bracha、Martin Odersky、David Stoutamire和Philip Wadler 系统、语言和应用(OOPSLA 98),1998年10月。

    存在类型对调用方隐藏其实现中的类型。如果X在T中是存在的,那么从任何调用对象都无法知道X的身份。已知的只是定义中提供的一组操作。

    从…起 Raw Types in Java 原始类型是没有类型参数的泛型接口或类的名称:

    List list = new ArrayList(); // raw type
    

    List<Integer> listIntgrs = new ArrayList<>(); // parameterized type
    

    因此,它不是JAVA中典型意义上的类型:原语或引用类型,但它是一种特殊形式的类型,编译器有规则并知道如何处理它。这是否意味着它真的不是一种类型?我会说不,它是一个psuedo类型,因为没有更好的词,因为它可以在不知道它的类型是什么的情况下声明和使用。

    但是参数化类型C<T、 ,T>,其中至少有一个T是a

    推荐文章