爲什麼不允許定義這樣的靜態成員:泛型參數聲明靜態成員
private static final <T extends Object> Map<Class<T>, BiFunction<T, T, Boolean>> SPECIFIC_HANDLERS = new HashMap<>();
相反,它只是允許使用非指定:
private static final Map<Class<?>, BiFunction<?, ?, Boolean>> SPECIFIC_HANDLERS = new HashMap<>();
有一種解決方法,使我可以定義BiFunction的兩個參數必須是相同的類型,並且Map的鍵必須是這些參數的類類型?
更新澄清(因爲@Mena的建議是不適合我):
我要地圖爲陣的equals方法的通用等於幫手。通用助手正式接收兩個對象。如果它們是數組,我必須將它傳遞給重載的Arrays.equals()方法之一。我wandted具有用於正確的方法的查找(實施例1):
private static final Map<Class<?>, BiFunction<?, ?, Boolean>> ARRAY_EQUALS_HANDLER = new HashMap<>();
static
{
ARRAY_EQUALS_HANDLER.put(Object[].class, (l, r) -> Arrays.equals((Object[]) l, (Object[]) r));
ARRAY_EQUALS_HANDLER.put(boolean[].class, (l, r) -> Arrays.equals((boolean[]) l, (boolean[]) r));
....
}
,然後用它喜歡:
boolean equal = ARRAY_EQUALS_HANDLER.get(anObj1.getClass()).apply(anObj1, anObj2);
的構建體(如Mena的)甚至不編譯:
private static <T extends Object> Map<Class<T>, BiFunction<T, T, Boolean>> getSpecificHandlers()
{
Map<Class<T>, BiFunction<T, T, Boolean>> result = new HashMap<>();
result.put(Object[].class, (l, r) -> Arrays.equals((Object[]) l, (Object[]) r));
result.put(boolean[].class, (l, r) -> Arrays.equals((boolean[]) l, (boolean[]) r));
return result;
}
如果我填充方法外部記錄所產生的地圖:
@SuppressWarnings({ "unchecked", "rawtypes" })
private static final Map<Class<?>, BiFunction<?, ?, Boolean>> ARRAY_EQUALS_HANDLER = (Map) getSpecificHandlers();
static
{
ARRAY_EQUALS_HANDLER.put(Object[].class, (l, r) -> Arrays.equals((Object[]) l, (Object[]) r));
...
}
然後整個類型安全已經消失了,因爲我必須在將它分配給最終靜態成員時執行(未檢查)類型轉換。
我的例子1以上的作品,但我一定要投收到的拉姆達使用時:
private static <T extends Object> boolean equalsArray(T anArray, T anOtherArray) {
Object o = ARRAY_EQUALS_HANDLER.get(anArray.getClass());
@SuppressWarnings("unchecked")
BiFunction<T, T, Boolean> func = (BiFunction<T, T, Boolean>) o;
Boolean result = func.apply(anArray, anOtherArray);
return result;
}
,則只能有一個實例。泛型在這種情況下是沒有意義的......或者,也許它是單身? –
如果它是靜態的而不是最終的,那麼可能會有很多分配給該引用。 –
@ReutSharabani其實,它是'靜態'_and_''最後'... –