事实上实现接口但不声明事实的类

时间:2014-03-03 20:38:59

标签: java interface proxy polymorphism

我将使用以下发布的代码说明我的问题。它是专门为此目的而创建的。它使用内部接口和内部类的事实并不重要(这只是一种便利)。代码按预期编译和运行。

在这段代码中,我使用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)。

问题

  1. 那么,静态继承(或组合)和基于动态反射的解决方案之间是否有某种东西?

  2. 我错过了一些非常简单的事吗?

0 个答案:

没有答案