鉴于课程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
派生。
答案 0 :(得分:3)
如果您不在类声明中使用泛型,那么显然您不能将类型X用于类字段。
无论如何,有一个天真的解决方案,将链接存储在某个地方:
A xa;
B xb;
public <X extends A & B> void setX(X x) { xa = x; xb = x };