Java:使用Classes作为hashmap中的值

N D*_*are 1 java class hashmap syntax-error

我正在尝试将自定义类用作a中的值Map<String, Class<?>>.以下是代码的相关部分:

以下是Map的声明和初始化main():

public static Map<String, Class<?>> mapQuery2ResponseType = new HashMap<String, Class<?>>();
static {
    mapQuery2ResponseType.put("string1", CustomClass1.class);
    mapQuery2ResponseType.put("string2", CustomClass2.class);
    mapQuery2ResponseType.put("string3", CustomClass3.class);
}
Run Code Online (Sandbox Code Playgroud)

现在我使用这个映射将一个对象类型转换为这些类之一:(假设所有类都包含一个getName()返回a 的方法String)

String name = (
                  (
                       mapQuery2ResponseType.get("string1")
                  )obj1
              ).getName();
Run Code Online (Sandbox Code Playgroud)

其中,obj1是通用类型T,

但它不允许我这样做并说:Syntax error on token "obj1", delete this token.

请帮我理解我在哪里做错了?

Edit:

当我使用下面的代码时,它完美地给了我预期的结果,

String name = (
                  (
                       CustomClass1
                  )obj1
              ).getName();
Run Code Online (Sandbox Code Playgroud)

和返回的obj1 类型相同mapQuery2ResponseType.put("string1", CustomClass1.class);.

在这里我可以看到一件事...如果我使用它直接使用它,我使用它"CustomClass1",而如果我从map中得到它mapQuery2ResponseType.get("string1"),它返回"CustomClass1.class".我不确定这两种方法有什么不同吗?如果有,那是什么?

所以实际上不会有任何转换,只是我将它用于大量的类,因此尝试使用通用方法.

Edit2:

在这个问题中给出:Java:"CustomClass1"和"CustomClass1.class"之间的区别?我认为,反思是这项任务的唯一解决方案.但任何人都可以解释如何使用反射来做到这一点吗?

Mat*_*all 5

简单地说,这是语法上无效的代码.并非巧合的是,编译器正在告诉你究竟是什么问题.

删除ob1.我不知道它是什么,或者你认为它应该做什么,但它没有任何意义.为了解释这一点,我将稍微改变你的代码:

原始代码:

String name = ((mapQuery2ResponseType.get("string1"))obj1).getName();
Run Code Online (Sandbox Code Playgroud)

现在有一个局部变量:

Class<?> clazz = mapQuery2ResponseType.get("string1");
String name = ((clazz) obj1).getName();
Run Code Online (Sandbox Code Playgroud)

好的,现在我想我明白了:你正在尝试使用一个Class实例来投射一个物体.你不能这样做 - Java的语法根本不允许它.以下是演员通常看起来的样子:

Object foo = "bar";
String baz = (String) foo;
Run Code Online (Sandbox Code Playgroud)

注意投表达令牌如何String,不是String.class.

Class#cast()可能看起来像一个有用的替代品,但这不会有任何用处,因为你只有Class<?>,而不是Class<T>.

忘掉了Map.我建议你完全重构代码,以便getName()在一个接口上定义方法,obj1并且所有类似的对象都实现(假设各种对象都有异构类型).

例如:

interface MyCommonInterface {
    String getName();
}

class MyClass implements MyCommonInterface {
    public String getName() {
        // snip
    }
}

// ...
MyClass obj1 = /* ... */
String name = obj1.getName();
Run Code Online (Sandbox Code Playgroud)

没有铸造,没有花哨Map的或Class实例.恰当,简单地使用语言的正确部分.