没有类型参数的Java通用类实例化

迪帕延·高什

在下面的代码中,如果我将Generic实例化为:

Generic gen=new Generic(1,2);

那是没有类型参数,然后当我这样做:

int a=gen.get_a();

它不起作用,并给

必填:int找到:Java.Lang.Object

但是ob.print()有效。所以当我这样做时:

int a=(Integer)gen.get_a();

然后就可以了。那么当没有类型参数传递时,擦除不能TObject类型代替因为T不能是原始类型吗?

public class Generic<T>
{
    T a;
    Generic(T a)
    {
        this.a=a;
    }
    void print()
    {
        System.out.print(a);
    }

    T get_a()
    {
        return a;
    }
}
大卫xxx

正如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它不扩展任何显式类,而是TObject隐式派生的
因此,您可以在变量中使用原始类型,并可以操作对象。
我认为编译器认为未指定的返回类型T是的最具体和兼容的类型T,在您的情况下为Object
您对集合具有相同的行为:在编译时,原始java.util.List操作会ObjectT遇到进行操作


编辑:在这里,我将给您另一个示例来说明原始类型(而不是声明类型),Object如果在类中声明的类型扩展了另一个类,则编译器不一定会使用该类。与您的想法相反。

如果Generic该类是这样声明的:

public class Generic<T extends MyClass>{
...
}

即使通过在变量的声明中使用原始类型,get_a()也将返回MyClass对象,因为for的最具体且兼容的类型T不是Objectbut MyClass

 Generic gen = new Generic(1);
 MyClass myClass = gen.get_a(new MyClass());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:实例化没有默认构造函数的通用类

Java通用类扩展了参数化类型

具有通用Java的类型参数类

为什么java的需要有限制类型参数的实例化其上限类投?

执行类字段是相同的通用类型没有指定的类类型参数

获取通用变量的参数化类型类

Eiffel:有没有办法在没有任何附加实例的情况下测试类的给定通用参数?

没有在ObservableSet forEach中丢失通配符的通用类参数类型

实例化实现通用接口实例的所有类

如何使用显式类型参数实例化通用记录?

Python类实例化:在没有附带参数的情况下调用类意味着什么?

无法实例化类中的通用数据类型

GWT序列化-类没有可实例化的子类型

带有类型化类参数的Java注释是否可能?

有没有办法找到Java中模板(通用)参数的类型?

序言:参数没有充分实例化

参数没有足够实例化的序言

没有充分实例化参数

具有newInstance的Java通用类型参数

通用类型。没有装箱转换或类型参数转换

实例化没有实现类的接口

排序没有实例化的类方法

没有实例化的类字典

Java模板如何返回带有模板类型的函数参数类类型实例

Java从类类型实例化对象

如何返回具有通用类型的类实例作为具有通用类型的接口?

在C ++中的模板实例化中将带有构造函数的类用作类型参数

具有非类型参数包的模糊类模板实例化

MassTransit.QuartzIntegration.ScheduledMessageJob:无法实例化没有空构造函数的类型(参数'ScheduledMessageJob')'