繁体   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