1

我正在尝试使用自定义类作为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);
}

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

String name = (
                  (
                       mapQuery2ResponseType.get("string1")
                  )obj1
              ).getName();

其中,obj1是泛型类型T

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

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

Edit:

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

String name = (
                  (
                       CustomClass1
                  )obj1
              ).getName();

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

在这里我可以看到一件事......如果我直接使用 use 它,我将它用作"CustomClass1",而如果我从 map by 获取它mapQuery2ResponseType.get("string1"),它会返回"CustomClass1.class"。我不确定这两种方法是否有区别?如果有,它是什么?

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

Edit2:

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

4

2 回答 2

5

简而言之,这是语法无效的代码。并非巧合的是,编译器会准确地告诉您问题所在。

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

原代码:

String name = ((mapQuery2ResponseType.get("string1"))obj1).getName();

现在有一个局部变量:

Class<?> clazz = mapQuery2ResponseType.get("string1");
String name = ((clazz) obj1).getName();

好的,现在我想我明白了:您正在尝试使用Class实例来投射对象。你不能这样做——Java 的语法根本不允许这样做。以下是演员表通常的样子:

Object foo = "bar";
String baz = (String) foo;

请注意强制转换表达式的标记是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();

没有强制转换,没有花哨Map的 s 或Class实例。正确、简单地使用语言的正确部分。

于 2013-03-23T05:08:50.317 回答
-2

我认为最好使用JAVA Reflection来做到这一点。

Typecast 需要在要转换的对象之前使用 Type 语法,所以你可以这样做 (CustomClass1.class)obj1,但你不能像 (mapQuery2ResponseType.get("string1"))obj1 那样做,因为编译器不能接受运行时环境中的演员表。

编译代码时,您的映射值被视为无效类型的值,因此您不能像您展示的那样进行强制转换。

于 2013-03-23T05:17:17.997 回答