是不是<u,t =“”extends =“”u =“”>和<t,u =“”super =“”t =“”>相同?</t,> </u,>

时间:2012-10-03 09:35:43

标签: java generics collections type-parameter

我对以下两个方法声明感到困惑:

    private <U, T extends U> T funWorks(T child, U parent) {
      // No compilation errors
    }

    private <T, U super T> T funNotWorks(T child, U parent) {
      // compilation errors    
    }

上述两种情况都不应该有效吗?通过类比如果U是T的父,那么T是U 的子项。那为什么第二个会出现编译错误?

EDIT :: 我认为,T extends TT super T都是有效的。对吗?

2 个答案:

答案 0 :(得分:7)

  • 类型参数(您的示例)只能使用extends(JLS #4.4):
TypeParameter:
    TypeVariable TypeBoundopt

TypeBound:
    extends TypeVariable
    extends ClassOrInterfaceType AdditionalBoundListopt

AdditionalBoundList:
    AdditionalBound AdditionalBoundList
    AdditionalBound

AdditionalBound:
    & InterfaceType
  • 通配符可以使用extendssuperJLS #4.5.1):
TypeArguments:
    < TypeArgumentList >

TypeArgumentList: 
    TypeArgument
    TypeArgumentList , TypeArgument

TypeArgument:
    ReferenceType
    Wildcard

Wildcard:
    ? WildcardBoundsopt

WildcardBounds:
    extends ReferenceType
    super ReferenceType

答案 1 :(得分:2)

您无法使用super绑定命名泛型。另请参阅this stackoverflow发布。