我是 Java 泛型的新手,并且設法使getKeyByValue函式與 a 一起作業HashMap<String, String>,但我不明白函式宣告如何模棱兩可/冗余并且仍然有效。例如,這兩個宣告都有效,但第一個對我來說沒有多大意義:
private <T, E> String getKeyByValue(Map<String, E> map, String value) {
for (Entry<String, E> entry : map.entrySet()) {
if (value.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
僅示例<E>:
private <E> String getKeyByValue(Map<String, E> map, String value) {
for (Entry<String, E> entry : map.entrySet()) {
if (value.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
uj5u.com熱心網友回復:
您的第一個示例只是宣告了從未使用過的型別引數 - 您可以根據需要宣告任意數量!
private <T, E, F, G> String getKeyByValue(Map<String, E> map, String value) {
for (Entry<String, E> entry : map.entrySet()) {
if (value.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
uj5u.com熱心網友回復:
對于第一個示例,T未使用通用格式型別,因此可以將其洗掉,從而使實作成為您的第二個方法實作。
在第二個實作中,Java 泛型使用沒有實用程式,因為類的equals方法(您使用型別化引數呼叫E)java.lang.String接受一個Object引數,因此任何物件都適合在那里。
private <E> String getKeyByValue(Map<String, E> map, String value) {
for (Map.Entry<String, E> entry : map.entrySet()) {
if (value.equals(entry.getValue())) { // there is no type checking needed over the value as it can be any acceptable object
return entry.getKey();
}
}
return null;
}
可以使用?通配符作為正式型別重寫相同的方法,因為不需要對Map值進行型別有界操作:
private String getKeyByValue(Map<String, ?> map, String value) {
for (Map.Entry<String, ?> entry : map.entrySet()) {
if (value.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
uj5u.com熱心網友回復:
對于第一種情況,型別引數T顯然是多余的。
從另一個角度來看,類似的情況是宣告方法輸入引數而不使用它。您可能認為編譯器不應該允許我們這樣做。但有時這種“靈活性”可能很有用。例如,我們可能有父類有一個只在子類中使用的帶有輸入引數的方法。雖然我想不出冗余型別引數有用的場景,但有人可能會利用這種語言靈活性來解決他們的問題。
我會說第一種情況應該被視為代碼異味,就像空 if 陳述句或宣告未使用的變數一樣。IDE 和 linter 是解決這些問題的正確工具,而不是編譯器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311165.html
上一篇:如何在List<T>中創建泛型函式以獲取Dart中的非可選型別-NullSafety
下一篇:將泛型型別傳遞給非泛型方法
