![](/img/trans.png)
[英]JAva:How to pass a custom object type as a parameter to a method and return the same custom object type value back
[英]How to pass in any Object type into a method? Java
注意:NPE 錯誤已修復
我需要一種在傳遞給方法時識別對象的方法。 它可以按名稱或對象的任何其他唯一內容,但不能按類型或值,因為在 HashMap 中可能存在具有相同類型或值的其他對象。
在 TOES.java 中:
import java.util.HashMap;
public class TOES{
private HashMap<Object, HashMap<String, Object>> TOES = new HashMap<Object, HashMap<String, Object>>();
public void add(Object foot, String tag, Object data){
HashMap<String, Object> TOE = TOES.get(foot);
if(TOE == null){
TOE = new HashMap<String, Object>;
}
TOE.put(tag, data);
TOES.put(foot, TOE);
}
public Object val(Object foot, String tag){
return TOES.get(foot).get(tag);
}
}
在 TOESTest1.java 中:
public class TOESTest1{
public static void main(String[] arg){
TOES Toes = new TOES();
Integer potatoes = 5;
Integer eyes = 7;
String tagname = "eyes";
Toes.add(potatoes,tagname,eyes);
potatoes = 3;
System.out.println(potatoes);
System.out.println(Toes.val(potatoes, "eyes"));
}
}
當 TOESTest1 運行時,它顯示最后一個 println 的錯誤和 val 方法中的返回。
輸出應該是:
3
7
(忽略奇怪的名字,TOES 是首字母縮寫詞)
我是 Java 新手,但不是編程新手(我知道 C++),所以...
您可以通過使用 Map 和自 Java 8 以來實現的 Optional 類來做到這一點。
Map 將包含字符串標識符和您要傳遞的對象。
Map<String, Optional<?>> mapToSendToMethod = new HashMap<String, Optional<?>>();
mapToSendToMethod.put("This is a string", Optional.of("This is a test"));
List<String> ListToSend = new ArrayList<>();
mapToSendToMethod.put("This is a List", Optional.of(ListToSend));
mapToSendToMethod.put("This is a number", Optional.of(123));`
someMethod(mapToSendToMethod);`
要在 Optional 中獲取對象,您可以使用Optional.get()
方法,如果有,它將返回對象,否則返回null
。
<?>
是<? extends Object>
<? extends Object>
,它也被稱為無界通配符。 所以你可以在你的泛型中指定任何類型的對象。
int
不從 Java 中的 Object 繼承。 您可以將int
s 轉換為Integer
s,然后您就可以將它們傳遞給一個接受對象的函數。
另請參閱: 在 Java 中 int 是一個對象嗎
因為您是說您是 Java 新手並了解 C++,所以 Java 與 C++ 的最大區別在於 Java 中的一切都是指針,本機除外。 所以當你聲明
HashMap<Object, String> a;
a
仍然沒有初始化,也沒有指向任何東西,這與用 Empty Constructor 初始化的 C++ 不同。
當然,您正在獲得 NPE,您還沒有初始化 TOE。 像這樣修復添加方法
public void add(Object foot, String tag, Object data){
HashMap<String, Object> TOE = TOES.get(foot);
if (TOE == null) {
TOE = new HashMap<String, Object>();
}
TOE.put(tag, data);
TOES.put(foot, TOE);
}
您正在通過引用尋找平等。 使用IdentityHashMap而不是使用 HashMap
...在 IdentityHashMap 中,兩個鍵 k1 和 k2 被認為相等當且僅當 (k1==k2)。 (在普通 Map 實現(如 HashMap)中,當且僅當 (k1==null ? k2==null : k1.equals(k2)) 時,兩個鍵 k1 和 k2 被認為是相等的。)
它不是與.equals
方法比較相等性,而是與.equals
的引用(指針地址)進行比較。
還有一個警告的想法。
這個類不是一個通用的 Map 實現! 雖然這個類實現了 Map 接口,但它故意違反了 Map 的一般約定,即在比較對象時強制使用 equals 方法。 此類設計用於僅在需要引用相等語義的極少數情況下使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.