java - 使用java泛型来扩展接口(interface)还是只是糟糕的设计?

标签 java generics

我对 Java 世界还是个新手(前 C++ 程序员)。我设计了一个接口(interface)层次结构来强制我的实现 @Override 接口(interface)中的方法。现在我正在思考“如何在java中做到这一点”。以下均为接口(interface)。

XMLDecoder      HTTPDecoder
    |                |
    ------------------
            |
        SSODecoder                  UserStuff
            |                           |
            -----------------------------
                         |
                         |
                     SSOBinding
                         |
                         |
                     Assertion

现在有趣的部分是我有一个实现 SSOBinding 的对象和另一个实现断言的对象。我的问题是必须实现 XMLDecoder HTTPDecoder 中的每个方法。我相信我有一些漂亮的设计,但为此:(

Java 泛型可以帮我解决这个问题吗?像这样的东西:

Assertion<XMLDecoder> anAssertion = new Assertion<XMLDecoder>();
anAssertion.OnlyMethodsInXMLDecoder();

至少这是我目前能想到的,但在实现上没有取得任何成功。

非常感谢!


编辑1

抱歉我的解释不好。

层次结构不是颠倒的(顶部是基础)。

SSODecoder 是我的问题。我知道它可以有 require XMLDecoderHTTPDecoder。忘记 SSOBinding。所以我可以有一个实现:

class AssertionImpl1 implements Assertion {
       // Only implementing XMLDecoder
}

class AssertionImpl2 implements Assertion {
       // Only implementing HTTPDecoder
}

它们的唯一区别是它们需要为解码器实现的方法。

最佳答案

简短回答:否。

我猜您的继承树是错误的:如果不是所有 SSODecoder 实例都需要实现 HTTPDecoder 和 XMLDecoder 中的方法,那么 SSODecoder 就不是两者的子接口(interface)。

您应该研究替代设计,其中 HTTPDecoder 和 XMLDecoder 是 SSODecoder 使用的策略。强制它们具有相同的接口(interface),并使 SSODecoder 委托(delegate)给它们......无论它们承担什么责任。

这样,您的调用将类似于:

Assertion anAssertion=new Assertion(new XMLDecoder());

关于java - 使用java泛型来扩展接口(interface)还是只是糟糕的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5344507/

相关文章:

java - 必须设置 Ignite 网格名称线程本地,或者应在 org.apache.ignite.thread.IgniteThread 下访问此方法

java - 如何阻止我的小程序刷新我的 GWT 页面?

Java 字符串用单词、空格和特殊字符分隔正则表达式

haskell - 这个 GHC.Generic 函数签名错误消息是什么意思?

java - 在 Eclipse 中使用可运行的 Jar 文件时出现 FileNotFoundException 错误

java - 刷新 Grails applicationContext

Java:泛型和集合类型检测存在问题

java - 通用树的自定义 Jackson 序列化程序

c# - 无法在泛型方法中隐式转换类型错误

generics - Swift 中的通用复制函数