在下面的代码中,如果我将Generic实例化为:
Generic gen=new Generic(1,2);
那是没有类型参数,然后当我这样做:
int a=gen.get_a();
它不起作用,并给
必填:int找到:Java.Lang.Object
但是ob.print()
有效。所以当我这样做时:
int a=(Integer)gen.get_a();
然后就可以了。那么当没有类型参数传递时,擦除不能T
用Object
类型代替,因为T
不能是原始类型吗?
public class Generic<T>
{
T a;
Generic(T a)
{
this.a=a;
}
void print()
{
System.out.print(a);
}
T get_a()
{
return a;
}
}
正如Jon Skeet所说,您在变量声明中使用的是原始类型。
Generic gen=new Generic(1,2);
int a=gen.get_a();
它不起作用,并给
required:int Found:Java.Lang.Object
如果在声明变量时未指定类型,则编译器将无法猜测类型。
那么由于没有类型参数传递时T不能是原始的,因此擦除是否用Object类型替换T?
使用类型需要在声明中指定类。而且原始不是类。Generic<int> gen = new Generic<>(1);
不会编译
因此,如果要使用整数值键入实例,则必须指定int原语的包装对象:Generic<Integer> gen = new Generic<>(1);
在声明依赖于数字类型的泛型的集合变量时,您一定已经注意到它。
Object
是Java的根类,在您的情况下,T
它不扩展任何显式类,而是T
从Object
隐式派生的。
因此,您可以在变量中使用原始类型,并可以操作对象。
我认为编译器认为未指定的返回类型T
是的最具体和兼容的类型T
,在您的情况下为Object
。
您对集合具有相同的行为:在编译时,原始java.util.List
操作会Object
在T
遇到时进行操作。
编辑:在这里,我将给您另一个示例来说明原始类型(而不是声明类型),Object
如果在类中声明的类型扩展了另一个类,则编译器不一定会使用该类。与您的想法相反。
如果Generic
该类是这样声明的:
public class Generic<T extends MyClass>{
...
}
即使通过在变量的声明中使用原始类型,get_a()
也将返回MyClass
对象,因为for的最具体且兼容的类型T
不是Object
but MyClass
。
Generic gen = new Generic(1);
MyClass myClass = gen.get_a(new MyClass());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句