Restrictions on Java intersection types with interfaces classes and type variables

后端 未结 2 1024
傲寒
傲寒 2021-01-13 03:36

Today I tried to write a class with a generic method that uses intersection types and got confused by the different error messages depending on the intersected types. Let\'s

相关标签:
2条回答
  • 2021-01-13 04:00

    This is explained in the section 4.4 Type Variables of The Java Language specification

    A type variable is an unqualified identifier used as a type in class, interface, method, and constructor bodies.

    A type variable is introduced by the declaration of a type parameter of a generic class, interface, method, or constructor (§8.1.2, §9.1.2, §8.4.4, §8.8.4).

    TypeParameter:
        {TypeParameterModifier} TypeIdentifier [TypeBound]
    
    TypeParameterModifier:
       Annotation
    
    TypeBound:
        extends TypeVariable
        extends ClassOrInterfaceType {AdditionalBound}
    
    AdditionalBound:
        & InterfaceType
    

    The scope of a type variable declared as type parameter is specified in §6.3.

    Every type variable declared as a type parameter has a bound. If no bound is declared for a type variable, Object is assumed. If a bound is declared, it consists of either:

    • a single type variable T, or
    • a class or interface type T possibly followed by interface types I1 & ... & In.

    It is a compile-time error if any of the types I1 ... In is a class type or type variable.

    The erasures (§4.6) of all constituent types of a bound must be pairwise different, or a compile-time error occurs.

    A type variable must not at the same time be a subtype of two interface types which are different parameterizations of the same generic interface, or a compile-time error occurs.

    The order of types in a bound is only significant in that the erasure of a type variable is determined by the first type in its bound, and that a class type or type variable may only appear in the first position.

    The members of a type variable X with bound T & I1 & ... & In are the members of the intersection type (§4.9) T & I1 & ... & In appearing at the point where the type variable is declared.

    0 讨论(0)
  • 2021-01-13 04:09

    You can only have 1 class but have multiple interfaces. If you have a class it must be the first one specified. If you follow this rule, you shouldn't get any compiling errors.

    See https://docs.oracle.com/javase/tutorial/java/generics/bounded.html

    0 讨论(0)
提交回复
热议问题