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"之间的区别?我认为,反思是这项任务的唯一解决方案.但任何人都可以解释如何使用反射来做到这一点吗?
简单地说,这是语法上无效的代码.并非巧合的是,编译器正在告诉你究竟是什么问题.
删除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实例.恰当,简单地使用语言的正确部分.
| 归档时间: |
|
| 查看次数: |
7431 次 |
| 最近记录: |