Java 有界类型作为属性

标签 java generics

给定类 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) 转换吗?


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/

相关文章:

java - 如何使用两种不同的语言来编写一个程序?

java - 为什么编译器声明不存在唯一的最大实例?

c# - 将通用字典转换为不同类型

java - 尝试将进度条添加到控制台

java.lang.ClassCastException : Creating a synchronized Linked List 异常

"Object"类的 java 泛型函数参数类型不匹配

ios - 将枚举与 Swift 中的关联值进行比较

java - Maven 找不到本地安装的 Artifact ,该 Artifact 仅存在于本地安装

java - 为什么在将重复项目添加到 Set 时不会出现错误?

java - 如何将编译后的类名与 Java 中的枚举成员匹配?