有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在客户端代码中使用类型处理多个类

假设我有以下的课程

class A {} 
class B {} 

abstract class ParentClass<T> {
    abstract void accept(T t);
} 

class Child1 extends ParentClass<A> {
    void accept(A a) {} 
} 

class Child2 extends ParentClass<B> {
    void accept(B b) {} 
} 

现在,如果我有一个客户端代码,我想让child1和child2的实例都映射到映射中的字符串(并且)还使用accept方法,这似乎是不可能的,我明白了原因。有更好的工作吗

我的客户端代码看起来像

class Client {
    Map<String, ParentClass<?>> map = new HashMap<>();

    public Client() {
       map.put("C1", new Child1());
       map.put("C2", new Child2());
    } 

    void callAccept(String type, Object o) {
        map.get(type).accept(o); //error
    } 

} 

#更新1 在示例中添加返回类型,因为我在mobile中键入问题时遗漏了返回类型


共 (1) 个答案

  1. # 1 楼答案

    “更好”取决于你想要实现什么。我理解你的问题,你只是想编译代码并理解它。很多变化都是可能的,“最佳”取决于您所解决的业务问题

    如果没有代码可能解决的业务问题,下面是编译时不会出错的代码。我修复了代码中的几个错误:

    // ParentClass.java
    
    class Base {}
    class A extends Base {}
    class B extends Base {}
    
    abstract class ParentClass<T> {
       abstract ParentClass<?> accept(Base base);
    }
    
    class Child1 extends ParentClass<A> {
      /* No idea what this is supposed to do, 
         so just return something type-compatible */
      ParentClass<A> accept(Base base) { return this; }
    }
    
    class Child2 extends ParentClass<B> {
      /* No idea what this is supposed to do, 
         so just return something type-compatible */  
      ParentClass<B> accept(Base base) { return this; }
    }
    

    ParentClass是一个容器,子类为Child1Child2

    上面的BaseParentClass子类中包含的有效负载的基类。您需要有效负载的基类,因为容器类(ParentClass)是子类的,并且您希望能够混合和匹配有效负载

    // Client.java
    
    import java.util.HashMap;
    import java.util.Map;
    
    class Client {
      Map<String, ParentClass<?>> map = new HashMap<>();
    
      public Client() {
         map.put("C1", new Child1());
         map.put("C2", new Child2());
      }
    
      void callAccept(String type, Base base) {
          map.get(type).accept(base);
      }
    }
    

    Java、Scala、Haskell和其他语言使用type theory,特别是category theory精确定义什么是允许的。实际上,在不迷失数学的前提下,上面的一般指导原则是处理泛型的一些考虑因素

    有关更多信息,请阅读Joshua Bloch的“有效Java”中关于通用容器的部分。我不相信他提到范畴理论,这是好的

    如果你对“刚好够”类型理论感兴趣,请阅读covariant types