gpt4 book ai didi

java - Guava TypeToken 和泛型类

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:21 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com