Java将类型绑定为属性

时间:2016-01-19 16:50:36

标签: java generics

鉴于课程ABa.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派生。

1 个答案:

答案 0 :(得分:3)

如果您不在类声明中使用泛型,那么显然您不能将类型X用于类字段。

无论如何,有一个天真的解决方案,将链接存储在某个地方:

A xa;
B xb; 

public <X extends A & B> void setX(X x) { xa = x; xb = x };
相关问题