Java通用通配符函数

时间:2017-08-11 18:08:05

标签: java generics

为什么带有上限的通用通配符函数在有可能输入子类作为参数时不允许访问子类的成员?

1 个答案:

答案 0 :(得分:1)

class Super{
    void superMethod(){}
}
class Sub extends Super{
    void subMethod(){}
}
class Sub2 extends Super{
    void subMethod2(){}
}

static <T extends Super> void processSuper(T input){
    // this is safe and compiles
    input.superMethod();

    // this doesn't compile
    input.subMethod();

    // nor this
    input.subMethod2();
}

查看上面的代码段。当我们使用extends Bound时,我们不知道实际类型是什么。编译器不知道任何给定类型的子类型,因此他无法找出该方法是什么。即使他这样做了,那么这实际上意味着使这个方法不能用于任何其他子类型。

您当然可以使用instanceof支票进行操作:

if(input instanceof Sub){
    ((Sub) input).subMethod();
}

这个编译,但它被认为是非常糟糕的风格(紧耦合)。 更好的OO设计是让superMethod()委托给SubSub2的不同功能。

TL; DR 由于编译器不了解子类型,因此无法实现您想要的功能。即使它确实有效,但OO Design也会很糟糕。