2015-02-12 91 views
0

我很難用泛型聲明Map。我想聲明一個地圖具有以下屬性:Java泛型和映射聲明

  • 的關鍵是從一個特定的接口派生的任何類型T的一個類對象(的IFoo)
  • 地圖的值是另一個地圖其鍵是一個字符串,其值是T型

我想我可以做這樣的:

 public static Map<Class<T extends IFoo>, Map<String, T>> valueCache = 
new HashMap<Class<T extends IFoo>, Map<String, T>>(); 

我得到一個語法錯誤「擴展」

(?)

如果我使用通配符這樣的替代性的T型似乎是語法正確:

public static Map<Class<? extends Typ>, Map<Integer, ?>> valueCache= 
new HashMap<Class<? extends Typ>, Map<Integer, ?>>(); 

但我不認爲這是我想要的,因爲我想成爲的確切類型Class對象將成爲第二個映射中的值。

任何幫助表示讚賞。

+1

嗯。這是一個靜態字段。它只有每一個副本。不應該知道那種類型嗎?爲什麼你需要一個佔位符?如果沒有實例,它如何具有泛型? – Thilo 2015-02-12 07:11:44

+0

我不認爲有任何方法可以在泛型類之外進行這樣的聲明。但是如果該字段不公開,至少可以使用泛型方法來訪問它並確保類型匹配。公共靜態變量是魔鬼。 – 2015-02-12 07:14:03

+0

你不能這樣做:你不能讓'Class'類型對應這些值。 – 2015-02-12 07:27:34

回答

1

泛型類型參數只能在類或方法聲明中聲明。

如果你不關心你找回IFoo的引用類型,你可以做

static Map<Class<? extends IFoo>, Map<String, IFoo>> fooMap; 

如果你想使用IFoo返回其子類型,那麼你需要做一些鑄造。

// abbreviated example 
class FooMap { 
    private static Map<Class<? extends IFoo>, Map<String, IFoo>> map = ...; 

    static void put(String key, IFoo foo) { 
     map.get(foo.getClass()).put(key, foo); 
    } 

    static <F extends IFoo> F get(Class<F> cls, String key) { 
     return cls.cast(map.get(cls).get(key)); 
    } 
} 

FooMap.put("foo", new Foo()); 
Foo foo = FooMap.get(Foo.class, "foo"); 
1

移動延伸到你的類的一般定義:既然你聲明一個地圖,你應該指定所有類型有很大幫助,應該總是正確的,所以應該是T應該是一個類型

public class ClassWithGeneric<T extends IFoo> { 
    Map<Class<T>, Map<String, T>> valueCache = new HashMap<Class<T>, Map<String, T>>(); 
} 
+1

但它是一個「靜態」字段。 – Thilo 2015-02-12 07:12:48

+2

據我所知,你不能在靜態字段中使用泛型參數。你能詳細說明爲什麼你需要這個靜態字段嗎? – colavitam 2015-02-12 07:14:15

-1

和不是通用的,因爲你把它聲明所以Java想知道在你不需要申報第二<>仿製藥,所以我不知道第二類型的內部地圖,所以我使用的Java對象的較新版本的類型

public static Map<IFoo,Map<String,Object>valueChache=new Hashmap<>(); 

兩者都應該是Co rrect

public static Map<IFoo,Map<String,Object>valueChache=new Hashmap<IFoo,Map<String,Object>(); 
0

試試這個,

public static Map<IFoo, Map<String, IFoo>> valueCache = new HashMap<IFoo, Map<String, IFoo>>(); 

通過這種方式,您使用的地圖的IFoo類型的類。

1

在技術上不可能做到你想做的事,但是你可以使用內部鑄造的訪問器方法來模擬它。例如:

private static Map<Class<?>, Map<String, ?>> valueCache = new HashMap<>(); 

public <T extends IFoo> Map<String, T> getMap(Class<T> key) { 
    return (Map<String, T>)value cache.get(key); 
}