-1

这个问题是Java 的延续:Using Classes as a value in hashmap

以下两种方法有什么区别?:

1)

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

和 2)

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

其中,mapQuery2ResponseType.get("string1")类型的返回值Class<?>

第一种方法效果很好,但在第二种方法中,它给出了一个错误提示Syntax error on token "obj1", delete this token

如何修改第二种方法(使用地图)以便像第一种情况一样工作?

我怎样才能mapQuery2ResponseType.get("string1")返回CustomClass1而不是CustomClass1.class

4

2 回答 2

3

Cast 是对编译器的指令,您不能等到运行时才知道要转换到哪个 Class!编译器无法知道当您调用该映射时,该映射是否实际上将具有 getName() 方法。

您需要在编译时对地图共享的所有内容进行强制转换,以使您确信它们都有一个“getName()”方法。如果那是不可能的,那么您将进入反射的世界以完善该方法,以便您可以调用它。

这是一个问题,它回答了当您在编译时不知道类时如何在任意对象上调用“getName”方法: How do I invoke an Java method when given the method name as a string?

如果您的方法确实是实际的 bean 属性 getter 和 setter,您还可以使用apache BeanUtils 库从对象中获取命名属性的值。

于 2013-03-23T06:26:56.303 回答
0

如何使 mapQuery2ResponseType.get("string1") 返回 CustomClass1 而不是 CustomClass1.class?

你不能。Java 类型转换需要在编译时已知的类/类型。

您应该能够执行您的第二个示例似乎正在尝试执行的操作,如下所示:

1)声明一个接口:

    public interface Named {
        String getName();
    }

2) 将请求类型映射中的所有类更改为implements Named.

3)将上面的“第二种方法”代码更改为:

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

另一种选择是使用反射在 上查找getName()方法obj1.getClass(),然后使用method.invoke(...)来调用它。

于 2013-03-23T07:03:03.890 回答