Java 为什么一个通用的;“工厂”;创建不同于来自相同内联代码的类型?
我使用Google GSON获得了以下简单片段:Java 为什么一个通用的;“工厂”;创建不同于来自相同内联代码的类型?,java,generics,reflection,gson,Java,Generics,Reflection,Gson,我使用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> cla
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"
import com.google.gson.reflect.TokenType;
导入java.lang.reflect.Type;
...
类型t1=new-TypeToken(){}.getType();
类型t2=类型for(MyClass.class);
...
专用类型typeFor(类clazz){
返回新的TypeToken(){}.getType();
}
...
t1.getClass().getCanonicalName();//“java.lang.Class”
t2.getClass().getCanonicalName();//“sun.reflect.generics.reflectiveObjects.TypeVariableImpl”
为什么类不一样?结构不一样 通过说
newtypetoken(){}
您正在创建TypeToken
的子类。这个匿名子类的基类已经为type参数填充了具体类型MyClass
,因此子类没有type参数
另一方面,构造newtypetoken(){}
创建类型TypeToken
的匿名子类,该子类没有填充参数,但取决于工厂方法的参数。因此,该类型参数的参数对于子类也不是固定的,这使得它实际上是一个具有类型参数的类
这两个类都是TypeToken
的匿名子类,如果使用type参数MyClass
调用factory方法,则在这两种情况下,实例都可分配给TypeToken
。但它们是不同的:工厂方法可以使用不同的类型参数调用,内联语句固定到指定的类型参数
在实例上调用getType
时会反映出这一点。工厂的结果具有可参数化的类型,该类型表示为typevariableinpl
的实例,而内联代码的实例没有类型参数,因此具有与其Class
相同的类型,因此由Class
对象本身表示
请注意,在
TypeToken
实例目录上调用getClass()
将返回类的原始类型,这将为两个构造提供相似的结果,表示TypeToken
的匿名子类。这些构造不相同
通过说newtypetoken(){}
您正在创建TypeToken
的子类。这个匿名子类的基类已经为type参数填充了具体类型MyClass
,因此子类没有type参数
另一方面,构造newtypetoken(){}
创建类型TypeToken
的匿名子类,该子类没有填充参数,但取决于工厂方法的参数。因此,该类型参数的参数对于子类也不是固定的,这使得它实际上是一个具有类型参数的类
这两个类都是TypeToken
的匿名子类,如果使用type参数MyClass
调用factory方法,则在这两种情况下,实例都可分配给TypeToken
。但它们是不同的:工厂方法可以使用不同的类型参数调用,内联语句固定到指定的类型参数
在实例上调用getType
时会反映出这一点。工厂的结果具有可参数化的类型,该类型表示为typevariableinpl
的实例,而内联代码的实例没有类型参数,因此具有与其Class
相同的类型,因此由Class
对象本身表示
请注意,在
TypeToken
实例目录上调用getClass()
将返回类的原始类型,这将为两个构造提供相似的结果,表示TypeToken
的匿名子类。这些构造不相同
通过说newtypetoken(){}
您正在创建TypeToken
的子类。这个匿名子类的基类已经为type参数填充了具体类型MyClass
,因此子类没有type参数
另一方面,构造newtypetoken(){}
创建类型TypeToken
的匿名子类,该子类没有填充参数,但取决于工厂方法的参数。因此,该类型参数的参数对于子类也不是固定的,这使得它实际上是一个具有类型参数的类
这两个类都是TypeToken
的匿名子类,如果使用type参数MyClass
调用factory方法,则在这两种情况下,实例都可分配给TypeToken
。但它们是不同的:工厂方法可以使用不同的类型参数调用,内联语句固定到指定的类型参数
在实例上调用getType
时会反映出这一点。工厂的结果具有可参数化的类型,该类型表示为typevariableinpl
的实例,而内联代码的实例没有类型参数,因此具有与其Class
相同的类型,因此由Class
对象本身表示
请注意,在
TypeToken
实例目录上调用getClass()
将返回类的原始类型,这将为两个构造提供相似的结果,表示TypeToken
的匿名子类。这些构造不相同
通过说newtypetoken(){}
您正在创建TypeToken
的子类。此匿名子类的基类已填入具体类型MyClass
f