【问题标题】:Java creating a generic class that implement another generic interface with constraintsJava 创建一个泛型类,该类实现另一个具有约束的泛型接口
【发布时间】:2020-11-28 05:47:20
【问题描述】:

要实现的接口:

public interface Message {
}

public interface Handles<T extends Message>  {
    void hanlde(T message);
}

具体实现:

public class EnforcementHandler<T extends Handles<T extends Message>> {

}

意外绑定

这种模式在 Java 中是否可行?

【问题讨论】:

  • public class EnforcementHandler&lt;T extends Handles&lt;T&gt; &amp; Message&gt; { 如果你想让T 实现MessageHandles&lt;T&gt;
  • 嗨@Turing85。没有冒犯的意思。你的提议是行不通的。 OP 的 Handles 是使用只有一个边界的类型参数声明的:Message。您正在声明 EnforcementHandler 的类型参数 T 有两个边界:HandlesMessage 。使用既实现 Handles 又实现 Message如您所定义的 T extends Handles&lt;T&gt; &amp; MessageSee for yourself with an experiment I did.
  • @deduper 在我提供的评论中,T 的具体实现(即代码中的HandlesMessage)必须同时实现Handle&lt;T&gt; Message。尽管这种方法非常值得怀疑,因为这两个实现应该分为两个类(因为它基本上说HandlesMessage 自己处理......),这是我推断出的 OP 想要的。我不推荐使用这种方法,而是it would work in theory。由于我不推荐这种方法并且@Louis 的答案已经存在(而且更干净),我只是将其发布为评论。
  • @deduper 谢谢你的回答。我正在使用遵循自定义界面的函数构建一个基本的复合模式。在这种情况下,自定义界面可能是 Consumer,但 Louis 提供的答案正是我想要做的。
  • ...它基本上说 HandlesMessage 自己处理...这是我推断 OP 想要的...“ -​​ 你介意我问你吗对于您在推断这种安排时设想的特定用例,@Turing85?那将是非常有教育意义的。 TIA。

标签: java generics javacompiler


【解决方案1】:

你必须写成EnforcementHandler&lt;M extends Message, T extends Handles&lt;M&gt;&gt;

【讨论】:

    【解决方案2】:

    你的 EnforcementHandler 的确切责任是什么,是模棱两可的。

    按其名称中的“处理程序”部分,向我表明它的责任是“处理”事物。所以这似乎是一个适合我的理解的实现......

    public class EnforcementHandler<M extends Message> implements Handler<M>{ 
        
        public void handle( M msg ) { out.printf( "%1$70s%n ", msg.read( ) ); }
    }
    

    This demo shows how it could be used

      ...
      Message msg = ( ) -> "Friends of space, how are you all? Have you eaten yet? Come visit us if you have time.";
      
      EnforcementHandler< Message > handler = new EnforcementHandler< >( );
      
      handler.handle( msg );
      ...
    

    …将这条友好消息打印到 stdout

    Friends of space, how are you all? Have you eaten yet? Come visit us if you have time.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2014-08-02
      • 2021-05-05
      • 2018-07-23
      • 1970-01-01
      • 2015-04-05
      相关资源
      最近更新 更多