【问题标题】:Java generic wildcard functionJava 通用通配符函数
【发布时间】:2017-08-11 18:08:04
【问题描述】:

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

【问题讨论】:

  • 不可能回答这样一个笼统的问题。请分享一些代码并突出显示您到底遇到了什么问题。
  • 欢迎来到 Stack Overflow!欢迎来到堆栈溢出!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example。使用“编辑”链接改进您的问题 - 不要通过 cmets 添加更多信息。谢谢!
  • 同理,任何变量都不允许访问其类型的子类的成员。因为它可能是一个子类,或者另一个子类,或者根本不是一个子类。
  • 你在说什么?_?

标签: java generics


【解决方案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();
}

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

您当然可以使用instanceof 检查:

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

这可以编译,但它被认为是非常糟糕的样式(紧密耦合)。 更好的 OO 设计是让superMethod() 代表SubSub2 的不同功能。


TL;DR 你想要的无法实现,因为编译器不知道子类型。即使它确实有效,那也将是糟糕的 OO 设计。

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2011-11-13
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多