【问题标题】:Java Generics, extended Generics and abstract classesJava 泛型、扩展泛型和抽象类
【发布时间】:2009-06-07 09:16:39
【问题描述】:

我设置了以下课程:

public abstract class Process<T,S> {
    ...
}

public abstract class Resource<T, S extends Process<T, S>> {
    protected S processer;
    ...
}

public class ProcessImpl<EventType1, EventType2> {
    ...
}

public class ResourceImpl extends Resource<EventType1, ProcessImpl> {
    processer = new ProcesserImpl();
    ...
}

在我到达ResourceImpl 之前一切都很好。我被告知ProcessImpl 不是Resource&lt;T,S&gt; 类型的有界参数&lt;S extends Process&lt;T,S&gt;&gt; 的有效替代品。

我尝试了各种方法来解决这个问题并不断碰壁。

有人有什么想法吗?

【问题讨论】:

    标签: java generics inheritance abstract


    【解决方案1】:
    public class ProcessImpl<EventType1, EventType2> {
    ...
    }
    

    因为 ProcessImpl 不会扩展进程。您的 ProcessImpl 不是从 Process 派生的,这就是您声明的参数应该是的。

    【讨论】:

      【解决方案2】:

      你可能想做这样的事情:

      public abstract class Process<T, S> {
      }
      
      public abstract class Resource<T, S extends Process<T, S>> {
          S processor;
      
      }
      
      public class ProcessImpl extends Process<EventType1, ProcessImpl> {
      }
      
      public class ResourceImpl extends Resource<EventType1, ProcessImpl> {
      
      }
      

      如果您将ResourceS 参数限制为处理器,您还需要在ProcessImpl 类上正确声明它。我不知道EventType2 是什么,但它应该实现 Process 接口。我假设你实际上想说ProcessImpl

      【讨论】:

        【解决方案3】:

        如果没有更好的代表,我看不到编辑原始版本或评论给定答案的方法。

        这段代码将存在于web层,eventtype2定义在持久层,只能在该层以下的核心层访问。

        不幸的是,没有紧密耦合(我想避免这种情况),我无法访问 EventType2。

        【讨论】:

        • 我不明白。你不能让 ProcessImpl 从 Process 扩展吗?
        【解决方案4】:

        如果您不希望您的代码依赖于包含Process 的某个现有包,您还可以引入一些新的接口包,而不依赖于类层次结构最底层的任何内容。 (当然,如果您能够更改继承的约束。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多