2017-08-11 59 views
-6

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

+0

这是不可能回答这样一个普遍的问题。请分享一些代码,并突出显示您所遇到的问题。 – Mureinik

+1

阅读此答案:https://stackoverflow.com/a/2723538/342852 –

+0

欢迎来到堆栈溢出!欢迎来到Stack Overflow!寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者无益。请参阅:如何创建[mcve]。使用“编辑”链接来改善你的*问题* - 不要通过评论添加更多信息。谢谢! – GhostCat

回答

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。