我将使用以下发布的代码说明我的问题。它是专门为此目的而创建的。它使用内部接口和内部类的事实并不重要(这只是一种便利)。代码按预期编译和运行。
在这段代码中,我使用inheritance
的唯一目的是声明一个类implements an interface
,所以稍后我可以将它们强制转换并使用多态行为。父类已经有符合接口的方法,因此不需要覆盖。
Swing仅用作示例。什么都没有概念特定于Swing。
import java.util.*;
import javax.swing.*;
public class TextComponent {
// Borrowed from com.google.gwt.user.client.ui
interface HasText {
String getText();
void setText(String text);
}
static class MyLabel extends JLabel implements HasText {
public MyLabel() {
super();
}
public MyLabel(String txt) {
super(txt);
}
}
static class MyTextField extends JTextField implements HasText {
public MyTextField() {
super();
}
public MyTextField(String txt) {
super(txt);
}
}
public static void main(String[] args) {
List<HasText> txtList = new ArrayList<>();
txtList.add(new MyLabel("Label"));
txtList.add(new MyTextField("Text Field"));
for (HasText component : txtList) {
System.out.println(component.getText());
}
}
}
处理此类任务(声明已经实现的界面)的正确方法似乎是使用dynamic proxies(如this SO帖子中所示)或第三方工具(例如{ {3}}或javassist指出CGLIB)。
问题:
那么,静态继承(或组合)和基于动态反射的解决方案之间是否有某种东西?
我错过了一些非常简单的事吗?