java - Guava TypeToken 和泛型类

标签 java generics guava

我正在使用 Guava TypeToken在我的项目中上课,但我得到了意想不到的结果。

我有MyGenericClass<T> :

public class MyGenericClass<T> implements MyInterface {

    private TypeToken<T> recordType;

    public MyGenericClass(String name) {
        this.recordType = new TypeToken<T>(getClass()) {};

        // ...
    }

    // ...

    @SuppressWarnings("unchecked")
    protected Class<T> getRecordType() {
        return (Class<T>) recordType.getRawType();
    }
}

所以如果我通过 new MyGenericClass<String>() 实例化一个对象然后调用 getRecordType()我希望得到 java.lang.String ,相反我得到 java.lang.Object .

但是,如果我扩展泛型类:

public class MyStringImpl extends  MyGenericClass<String> {
    // ...
}

并实例化这个新类:new MyStringImpl()然后我得到正确的结果。

为什么会这样?这是 TypeToken 的预期行为吗? ?

最佳答案

在 Ian 的回答中添加一些无聊的细节:如果 TypeToken 以您预期的方式工作会很好,但这是不可能的。当你声明

public class MyGenericClass<T> implements MyInterface {...}

JVM 看到类似的东西

public class MyGenericClass<Object> implements MyInterface {...}

由于删除。

但是当你声明

public class MyStringImpl extends MyGenericClass<String> {...}

然后在MyStringImpl 的定义中记录了使用的泛型,可以通过Class#getGenericSuperclass() 获取。 .这就是 TypeToken 背后的(部分)魔力。

关于java - Guava TypeToken 和泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124151/

相关文章:

java - JPA 中的持久 2D boolean 数组 (openJPA)

java - 覆盖自身的字符串数组列表

Java 服务在 Linux 上被终止。需要帮助来理解行为

java - 为什么 Gson 将一个 LinkedListMultimap map View 序列化为 null?

java - 为什么这个 Guava 按值排序 map 有效?

java - 如何将richfaces标签添加到jsf页面?

c# - 为什么必须对后代类型重新声明泛型类型限制?

协议(protocol)中使用的 Swift 通用类型不起作用

java 10 gradle 项目 : automatic module not found

c# - 在 List<Parent> 对象的泛型函数中使用子类型