我有一个通用类如下:
public MyClass<T>{
T id;
public T getId(){return id;}
public void setId(T id){this.id=id;}
}
我实例化如下:
MyClass<String> myClass = new MyClass<String>();
通过反射查看getId()方法时(i == getId方法的索引):
myClass.getClass().getMethods()[i].getReturnType();
会说返回类型是java.lang.Object。
我想我在这里问的是不可能的问题,但是,在这种情况下,类是否有可能实际说 java.lang.String?
我问这个问题的原因是因为我使用的是 App 引擎,它是 Datastore。一个简化的场景:我的所有类都继承自 MyClass,因此它们获得了类型为 T 的 id,其中 T 可以是 Long、String 或 Key。但是数据存储无论如何认为 id 字段是一个 java.lang.Object,这是被禁止的。我是否需要创建 MyClassString、MyClassLong 等类,或者有什么方法可以绕过它吗?
谢谢!
编辑:在“解决”这个问题后搜索了另一个问题。我找到了这个 question实际上提到了我的确切问题。
最佳答案
参数化类型的类型参数在运行时通过称为类型删除的过程丢失。在运行时,无法确定方法返回 String
,因为实际使用的类型参数不可用。
解决这个问题的一种方法是实现一个通用接口(interface),这将允许以多态方式使用对象:
Identifiable.java
public interface Identifiable<T> {
T getId();
void setId(T t);
}
Person.java
public class Person implements Identifiable<String> {
private String id;
@Override
public String getId() {
return id;
}
@Override
public void setId(String t) {
this.id = t;
}
public static void main(String[] args) {
Person person = new Person();
Method method = person.getClass().getMethods()[1]; //prints getId
System.out.println(method.getName());
System.out.println(method.getGenericReturnType()); //prints String
}
}
关于Java - 通过反射查看时,通用变量变为 java.lang.Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20396170/