如何将任何Object类型传递给方法? Java的

时间:2014-09-11 00:12:03

标签: java object

注意:NPE错误已修复

我需要一种在传递给方法时识别Object的方法。它可以是名称或Object的任何其他唯一名称,但不能通过类型或值,因为在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 ++),所以......

3 个答案:

答案 0 :(得分:1)

您可以通过使用 Map 和自 Java 8 以来实现的 Optional 类来做到这一点。

地图将包含字符串标识符和您要传递的对象。

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> 的简写,也称为无界通配符。因此,您可以在泛型中指定任何类型的对象。

答案 1 :(得分:0)

int并不从Java中的Object继承。您可以将int转换为Integer s,然后您就可以将它们传递给带有对象的函数。

另请参阅:Is int an object in Java

答案 2 :(得分:0)

因为你说你不熟悉Java并且熟悉C ++,所以Java与C ++的最大区别在于Java中的一切都是指针,例外是本机。 所以当你宣布

HashMap<Object, String> a;

a仍然没有初始化,也没有指向任何东西,这与使用空构造函数初始化的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);
}

更新结束

您正在通过参考寻找平等。而不是使用HashMap,使用IdentityHashMap

  

...在IdentityHashMap中,如果将两个键k1和k2视为相等   并且仅当(k1 == k2)时。 (在正常的Map实现中(如HashMap)   当且仅当(k1 == null?)时,两个密钥k1和k2被认为是相等的?   k2 == null:k1.equals(k2))。)

不是将等式与.equals方法进行比较,而是与对象的引用(指针地址)进行比较。

还有一个警告的想法。

  

这个类不是通用的Map实现!虽然这个   class实现了Map接口,故意违反Map的   一般合同,强制要求使用equals方法   比较对象。此类仅适用于罕见的类   需要引用相等语义的情况。