【问题标题】:Java bounded types as attributesJava 有界类型作为属性
【发布时间】:2016-01-19 16:50:35
【问题描述】:

给定类 AB,以及 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&lt;X extends A &amp; B&gt;的情况下这样做?那将是显而易见的解决方案。您的解决方案需要在方法Y 中转换为B。一般来说,您会希望避免强制转换。
  • 你可以有一个扩展AB的接口M,并使用它,而不是A&amp;B...
  • @thecoop class A 是一个具体的类,而 class B 是一个接口。编辑澄清。
  • @bayou.io 查看更新后的问题。您评论中的链接仅适用于仅界面问题;就我而言,我有一个接口和一个具体的类

标签: java generics


【解决方案1】:

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

无论如何,将两个链接都存储在某处是一种天真的解决方案:

A xa;
B xb; 

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

【讨论】:

  • 它确实像宣传的那样工作,尽管它确实引入了一些重复。除非出现更好的情况,否则我会接受。
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 2021-12-24
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多