簡體   English   中英

在地圖中存儲抽象類型和具體類型

[英]Storing abstract and concrete types in Map

我有一個類似的接口和類:

public interface Message extends Wrappable
{
}

public class MessageImpl implements Message
{
}

我想使用Java泛型將這些類存儲到Map中,接口作為鍵,impl作為值:

map.put(Message.class, MessageImpl.class);

我希望它是類型安全的,其中鍵必須擴展Wrappable,值必須擴展鍵類。 有什么幫助嗎?

基本Map不能安全地執行此類型,但是您可以圍繞Map創建一個簡單的包裝器以強制執行類型安全。 可能看起來像

class MyMap {
  private final Map<Class<?>, Class<?>> map = new HashMap<>();
  public <A extends Wrappable, B extends A> void put(
      Class<A> interfaceClass, Class<B> implClass) {
    // you can't statically enforce that A is an interface 
    // and B is a concrete class, though you can do it at runtime
    assert interfaceClass.isInterface();
    assert !Modifier.isAbstract(implClass.getModifiers());
    map.put(interfaceClass, implClass);
  }

  public <A extends Wrappable> Class<? extends A> get(Class<A> interfaceClass) {
    return (Class<? extends A>) map.get(interfaceClass);
  }
}

暫無
暫無

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

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