繁体   English   中英

Java泛型类可以在实例化时自动确定类型吗

[英]Can java generic class automatically determing type at instantiation

我有一个通用类:

public class ResultCard<T extends Bike>

private T bike;

public ResultCard(T bike)
{
    this.bike = bike;
}

public int someMethod()
{
     bike.showSpeed();
}

然后我有几个班级扩展了Bike。 当我测试ResultCard bean时,我很惊讶地可以在不指定类型的情况下实例化它:

ResultCard resultCard = new ResultCard(bikeType);

并且以下调用有效:

resultCard.someMethod();

我认为ResultCard会以Object类型作为其泛型进行实例化,因为在实例化时未指定它,然后对someMethod()的调用会引发编译时错误? 但是那没有发生。 好像它从我的构造函数中确定类型一样?

实例化bean时未指定泛型类型有什么问题吗? 我误会了吗?

谢谢。

当具有类型绑定的通用类型参数时,如ResultCard<T extends Bike> ,在编译过程中,类型参数将由绑定替换。 创建原始类型new ResultCard(...)或参数化类型new ResultCard<SomeBike>(...)的实例都没关系。 编译后,结果将相同。

仅当删除类型绑定时,type参数才会按预期被Object替换。

您看到的是所谓的原始类型 它的行为接近ResultCard<Bike> ,但是您需要了解一些陷阱 (请参阅第36页)。 例如,如果您在此类的任何重载方法中使用了泛型,例如int addNotes(Collection<Object> notes)void addNotes(List<Note> notes) ,则这两个将变成int addNotes(Collection notes)void addNotes(List notes) ,这很可能会改变分辨率的工作方式。

另外,由于原始类型缺少其他类型信息,因此依赖于通用技巧的代码将无法编译。 例如,类Class<T>是用其表示的类参数化的泛型类。 结果,您可以定义将Class<T>的实例作为参数并返回T ,知道这是您传递的同一类。 如果将其保存到Class类型(没有类型参数)的变量中 ,则方便的代码将无法以某种晦涩的方式进行编译。

由于在实例化时尚未指定通用类型,因此它是原始类型。

创建参数化类型的ResultCard

ResultCard<Bike> resultCard= new ResultCard<Bike>();

如果省略实际类型参数,则创建一个原始类型

ResultCard rawResultCard = ResultCard();

因此,ResultCard是通用类型ResultCard的原始类型。您始终可以将rawtype用于通用类型。

你知道吗!!!! 我们没有将List类作为通用类,但是经过一段时间后,它获得了对通用List。的支持,因此为了向后兼容,仍然可以使用List。

在这里,您已经指定了准类型,它允许使用Bike Class参数实例化它,还允许调用该方法。

但是如果不是其他类不能扩展Bike类,那么它将给出编译时错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM