注意: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 ++),所以......
答案 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,然后您就可以将它们传递给带有对象的函数。
答案 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方法 比较对象。此类仅适用于罕见的类 需要引用相等语义的情况。