java泛型类能否在实例化时自动确定类型

java泛型类能否在实例化时自动确定类型,java,generics,javabeans,Java,Generics,Javabeans,我有一个通用类: public class ResultCard<T extends Bike> private T bike; public ResultCard(T bike) { this.bike = bike; } public int someMethod() { bike.showSpeed(); } 下面的电话成功了: resultCard.someMethod(); 我认为ResultCard将以对象类型作为其泛型进行实例化,因为我在实例

我有一个通用类:

public class ResultCard<T extends Bike>

private T bike;

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

public int someMethod()
{
     bike.showSpeed();
}
下面的电话成功了:

resultCard.someMethod();
我认为ResultCard将以对象类型作为其泛型进行实例化,因为我在实例化时没有指定它,然后调用
someMethod()
将抛出编译时错误?但那没有发生。好像它是通过我的构造函数或其他什么来确定类型的

在实例化我的bean时不指定泛型类型有什么问题吗?我是不是误解了什么


谢谢。

当您有一个带有类型绑定的泛型类型参数时,如在
ResultCard
中,类型参数将在编译过程中替换为绑定。创建原始类型
newresultcard(…)
或参数化类型
newresultcard(…)
的实例并不重要。编译后的结果将是相同的


只有当您删除类型绑定时,类型参数才会按预期被对象替换。

您看到的是所谓的。其行为接近于
ResultCard
,但也有(见第36页)。例如,如果在此类中的任何重载方法中使用泛型,例如
int-addNotes(Collection notes)
void-addNotes(List notes)
,这两个将变成
int-addNotes(Collection notes)
void-addNotes(List notes)
,这可能会改变解析的工作方式


此外,由于原始类型缺少额外的类型信息,依赖于泛型技巧的代码将无法编译。例如,class
class
是一个通用类,用它所表示的类参数化。因此,您可以定义将
Class
的实例作为参数的方法,并返回
T
,因为您知道它是您所传递的同一个类。但如果这样,方便的代码将无法以一种有点模糊的方式编译。

由于在实例化时没有指定泛型类型,因此它是原始类型

创建参数化类型的ResultCard

ResultCard<Bike> resultCard= new ResultCard<Bike>();
因此ResultCard是泛型类型ResultCard的原始类型 您始终可以将rawtype用于泛型类型

你知道吗!!!! 我们并没有将List类作为泛型类。但过了一段时间后,它被赋予了对泛型List的支持。所以为了向后兼容,仍然可以使用List

在这里,正如您指定的paramitrized类型一样,它允许使用Bike类参数对其进行实例化,还允许调用该方法


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

由于T扩展Bike,构造函数参数和字段的类型(在字节码中)是
Bike
,而不是
Object
。我明白了。缺点是现在ResultCard保存Bike对象,而不是我设置为Bike的任何子类。
ResultCard<Bike> resultCard= new ResultCard<Bike>();
ResultCard rawResultCard = ResultCard();