我想要使用接口創建一個引用某種服務的類。該服務可以有不同的實現。不同的實現將處理不同類型的請求。在過去,我會定義一個接口是這樣的:使用泛型的可重用接口
public interface I_Test
{
public String get(String key, Enum type);
}
,並實現它是這樣的:
public class Test_1 implements I_Test
{
public String get(String key, Enum type)
{
Enum_1 t1 = (Enum_1)type;
switch(t1)
{
case NAME:
return "Garry";
case DOB:
return "1966";
default:
throw new IllegalArgumentException("Unkown type [" + type + "]");
}
}
}
好是我可以用不同的實現我的接口,以滿足不同的需求。 不好的是我必須鍵入強制轉換,因此在運行時有風險。
我希望仿製藥可以解決這個問題,所以我這樣做:
public interface I_Test<T extends Enum>
{
public String get(String key, T type);
}
這:
public class Test_1 implements I_Test<Enum_1>
{
public String get(String key, Enum_1 type)
{
switch(type)
{
case NAME:
return "Garry";
case DOB:
return "1966";
default:
throw new IllegalArgumentException("Unkown type [" + type + "]");
}
}
}
,但是當我去使用我得到的類型安全警告,除非我的東西聲明我的變量與我打算使用的類型,如下所示:
I_Test<Enum_1> t1 = new Test_1();
這真的讓我感到困擾,因爲th創建I_Test
接口的整個目的是讓我可以使用不同的實現,但似乎我必須在編譯時鎖定到特定類型以避免此警告!
有沒有什麼辦法可以編寫一個可重用的界面,使用泛型沒有這個惱人的警告?
我真的不明白你的界面做了什麼(這是什麼意思「以處理不同類型的請求」,在什麼情況下?),但它看起來像一個接口的濫用 - 主要是因爲你的實現使用`switch`來代替多態性。看起來你的上述邏輯可以通過`Map` –
davin
2011-02-07 18:59:29
更容易完成,我必須刪除敏感數據,應該做得更好 - 對於混淆抱歉。我可以說的是get獲取數據和請求類型。請求的類型取決於實現 - 當前有4個支持的實現以及30多種不同的請求類型,分散在我工作的地方。 – BigMac66 2011-02-07 19:52:45