给定类 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)
转换吗?
Edit - 在我的实际问题中,A
是具体类(JComponent
),而B
是一个界面。我想允许将实现 B 的任何 JComponent
传递给方法 setX()
- 如果我创建了一个
abstract class M extends JComponent implements B { ... }
我将无法再调用 setX(myJPanelThatImplementsB)
或 setX(myJLabelThatImplementsB)
,因为它们需要派生自 M
.
最佳答案
如果您在类声明中不使用泛型,显然您不能将类型 X 用于类字段。
无论如何,有一个天真的解决方案,将两个链接都存储在某个地方:
A xa;
B xb;
public <X extends A & B> void setX(X x) { xa = x; xb = x };
关于Java 有界类型作为属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882446/