gpt4 book ai didi

java - 为什么通用 "factory"创建的类型与来自相同内联代码的类型不同?

转载 作者:行者123 更新时间:2023-12-01 23:23:27 26 4
gpt4 key购买 nike

我有一个使用 Google GSON 的简单代码片段:

 import com.google.gson.reflect.TokenType;
import java.lang.reflect.Type;
...
Type t1 = new TypeToken<MyClass>(){}.getType();
Type t2 = typeFor(MyClass.class);
...
private <T> Type typeFor(Class<T> clazz) {
return new TypeToken<T>(){}.getType();
}
...
t1.getClass().getCanonicalName(); // "java.lang.Class"
t2.getClass().getCanonicalName(); // "sun.reflect.generics.reflectiveObjects.TypeVariableImpl"

为什么类不一样?

最佳答案

结构并不相同。

通过说 new TypeToken<MyClass>(){}您正在创建 TypeToken<MyClass> 的子类。这个匿名子类的基类已经填充了具体类型MyClass对于类型参数,因此子类没有类型参数。

另一方面,构造 new TypeToken<T>(){}创建 TypeToken<T> 类型的匿名子类它没有填充参数,但取决于工厂方法的参数。因此,该类型参数的参数对于子类来说也不是固定的,这使得它实际上是一个带有类型参数的类。

这两个类都是 TypeToken 的匿名子类如果您使用类型参数 MyClass 调用工厂方法,实例可分配给 TypeToken<MyClass>在这两种情况下。但它们是不同的:工厂方法可以使用不同的类型参数来调用,您的内联语句固定为指定的类型参数。

这在调用 getType 时得到反射(reflect)关于实例。工厂的结果具有可参数化的类型,表示 TypeVariableImpl 的实例。而内联代码的实例没有类型参数,因此具有与其 Class 相同的类型因此由 Class 表示对象本身。

请注意调用getClass()在您的TypeToken上instance directy 将返回类的原始类型,这将为两个构造提供类似的结果,表示 TypeToken 的匿名子类.

关于java - 为什么通用 "factory"创建的类型与来自相同内联代码的类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20346180/

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