Java - 通过反射查看时,通用变量变为 java.lang.Object

标签 java google-app-engine generics google-cloud-datastore

我有一个通用类如下:

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,因为实际使用的类型参数不可用。

Generic Faq

解决这个问题的一种方法是实现一个通用接口(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/

相关文章:

java - 如何将一大串整数转换为二进制?

php - 谷歌应用程序引擎[PHP] : Error trying to establish database connection

java - 泛型:基于泛型类的泛型类

多个类的 C# 泛型方法

java - 从 ArrayList 创建顺序文本文件

java - java多线程回调

使用复合增长的Java程序

python - Google App Engine 和 Django 模板 : why do these two cases differ?

java - Google App Engine 在浏览器中打开 excel 文件而不是下载 - Vaadin

c# - C# 中泛型列表的类型转换