Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么一个通用的;“工厂”;创建不同于来自相同内联代码的类型?_Java_Generics_Reflection_Gson - Fatal编程技术网

Java 为什么一个通用的;“工厂”;创建不同于来自相同内联代码的类型?

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

我使用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"
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