作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 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/
我是一名优秀的程序员,十分优秀!