我有一个原始类型Map来存储数据,因为数据类型可能不同。不幸的是,它总是将值作为Object类型返回,即使我们可以使用getClass()获得确切的类型。
如何从原始类型Map获取特定类型值?
/*
Expected result:
class java.lang.Boolean
func1(boolean p)
class java.lang.Integer
func1(int p)
class java.lang.Double
func1(double p)
class java.lang.Character
func1(char p)
class java.lang.String
func1(String p)
class java.lang.Object
func1(Object p)
class java.lang.Boolean
func1(boolean p)
class java.lang.Integer
func1(int p)
class java.lang.Double
func1(double p)
class java.lang.Character
func1(char p)
class java.lang.String
func1(String p)
class java.util.LinkedList
func1(List p)
class java.util.LinkedHashMap
func1(Map p)
class [Ljava.lang.Object;
func1(Object[] p)
Actual result:
class java.lang.Boolean
func1(Object p)
class java.lang.Integer
func1(Object p)
class java.lang.Double
func1(Object p)
class java.lang.Character
func1(Object p)
class java.lang.String
func1(Object p)
class java.lang.Object
func1(Object p)
class java.lang.Boolean
func1(Object p)
class java.lang.Integer
func1(Object p)
class java.lang.Double
func1(Object p)
class java.lang.Character
func1(Object p)
class java.lang.String
func1(Object p)
class java.util.LinkedList
func1(Object p)
class java.util.LinkedHashMap
func1(Object p)
class [Ljava.lang.Object;
func1(Object p)
*/
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map map = init();
for (Object v_obj : map.keySet()) {
println(v_obj + ":\t" + map.get(v_obj).getClass());
func1(map.get(v_obj));
}
}
public static void func1(boolean p) {
println("func1(boolean p)");
}
public static void func1(int p) {
println("func1(int p)");
}
public static void func1(double p) {
println("func1(double p)");
}
public static void func1(char p) {
println("func1(char p)");
}
public static void func1(String p) {
println("func1(String p)");
}
public static void func1(Object p) {
println("func1(Object p)");
}
public static void func1(List p) {
println("func1(List p)");
}
public static void func1(Map p) {
println("func1(Map p)");
}
public static void func1(Object[] p) {
println("func1(Object[] p)");
}
public static <T> void println(T p_t) {
System.out.println(p_t);
}
public static Map init() {
Map map = new LinkedHashMap();
//map.put("null", null);
map.put("boolean", true);
map.put("int", 123);
map.put("double", 123.456);
map.put("char", 'c');
map.put("string", "123asd'\"/\\");
map.put("Object", new Object());
map.put("Boolean", new Boolean(true));
map.put("Integer", new Integer(123));
map.put("Double", new Double(123.456));
map.put("Character", new Character('c'));
map.put("String", new String("123asd'\"/\\"));
map.put("List", new LinkedList());
map.put("Map", new LinkedHashMap());
map.put("Object[]", new Object[]{});
return map;
}
}
答案 0 :(得分:1)
首先要理解的是泛型是编译时的概念。关于它们没有任何动态(运行时)。
接下来要理解的是,方法在编译时根据参数类型和提供的参数类型进行绑定。
中的哪一个public static void func1(boolean p) {
println("func1(boolean p)");
}
public static void func1(int p) {
println("func1(int p)");
}
// and more
绑定取决于调用中使用的实际类型参数。你正在使用
for (Object v_obj : map.values()) {
println(v_obj.getClass());
func1(v_obj.getClass().cast(v_obj));
}
那是什么
v_obj.getClass().cast(v_obj)
返回? Object#getClass()
个州的javadoc
实际结果类型为
Class<? extends |X|>
,其中|X|
为 擦除getClass
所在表达式的静态类型 调用。
调用getClass
的表达式为v_obj
,其类型为Object
。所以
v_obj.getClass()
返回类型Class<? extends Object>
的值。 Class#cast(Object)
使用绑定到类型参数T
的类型值作为其返回值。在这种情况下,也是Object
。因此,类型为Object
的参数绑定的方法是参数类型为Object
的方法。