【发布时间】:2016-01-19 16:50:35
【问题描述】:
给定类 A 和 B,以及 a.methodA() 和 b.methodB(),到目前为止这有效:
class C {
...
public <X extends A & B> void setX(X x) { x.methodA(); x.methodB(); }
}
但是,我想稍后像在
中一样使用相同的 x 对象class C {
X x; // <-- this does not compile
public <X extends A & B> void setX(X x) { this.x = x; };
public void Y() { x.methodA(); x.methodB(); }
}
有没有办法声明通配符类型X 的属性而不用X 参数化整个类?我目前的做法是
class C {
A x; // (but would also work with B)
public <X extends A & B> void setX(X x) { this.x = x; };
public void Y() { x.methodA(); ((B)x).methodB(); }
}
我可以避免((B)x)演员吗?
编辑 - 在我的实际问题中,A 是一个具体的类(JComponent),而B 是一个接口。我想允许将任何实现 B 的 JComponent 传递给方法 setX() - 如果我创建了一个
abstract class M extends JComponent implements B { ... }
我将无法再调用setX(myJPanelThatImplementsB) 或setX(myJLabelThatImplementsB),因为它们需要派生自M。
【问题讨论】:
-
为什么要在不参数化类
class C<X extends A & B>的情况下这样做?那将是显而易见的解决方案。您的解决方案需要在方法Y中转换为B。一般来说,您会希望避免强制转换。 -
你可以有一个扩展
A和B的接口M,并使用它,而不是A&B... -
@thecoop class
A是一个具体的类,而 classB是一个接口。编辑澄清。 -
@bayou.io 查看更新后的问题。您评论中的链接仅适用于仅界面问题;就我而言,我有一个接口和一个具体的类