簡體   English   中英

如何將任何對象類型傳入方法? 爪哇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM