簡體   English   中英

在客戶端代碼中處理多個具有類型的類

[英]Handling multiple Classes with Types in client code

假設我有以下課程

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 的實例都映射到 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, Object o) {
        map.get(type).accept(o); //error
    } 

} 

#Update 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的子類。

上面的Base是包含在ParentClass子類中的有效負載的基礎 class。 您需要一個基本的 class 作為有效負載,因為容器 class ( 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 和其他語言使用類型理論,特別是類別理論來精確定義允許的內容。 實際上,在不迷失數學的情況下,上述一般准則是使用 generics 的一些注意事項。

有關更多信息,請閱讀 Joshua Bloch 的“Effective Java”中關於通用容器的部分。 我不相信他提到范疇論,這很好。

如果您對“剛剛好”的類型理論感興趣,請閱讀協變類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM