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

时间:2015-07-05 10:00:33

标签: java generics javabeans

我有一个通用类:

for i in {${linux}}
do
   scp ${WORKSPACE}/schemasTST.txt ads_foo@${i}:/DATA/ORACLE_UPGRADE
done

然后我有几个扩展自行车的课程。 当我测试出ResultCard bean时,我很惊讶我可以在不指定类型的情况下实例化它:

public class ResultCard<T extends Bike>

private T bike;

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

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

以及以下调用有效:

ResultCard resultCard = new ResultCard(bikeType);

我认为ResultCard将使用Object类型作为其泛型进行实例化,因为我在实例化时没有指定它,然后调用resultCard.someMethod(); 会抛出编译时错误?但那并没有发生。好像它从我的构造函数或其他东西确定类型?

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

谢谢。

3 个答案:

答案 0 :(得分:0)

如果您具有类型绑定的泛型类型参数,如ResultCard<T extends Bike>中所示,则在编译期间,类型参数将替换为绑定。如果您创建原始类型new ResultCard(...)或参数化类型new ResultCard<SomeBike>(...)的实例,则无关紧要。编译后结果将是相同的。

只有删除了类型绑定,type参数才会被您想象的替换为Object。

答案 1 :(得分:0)

你看到的是所谓的raw type。它的行为接近ResultCard<Bike>,但有some gotchas you need to know about(参见第36页)。例如,如果您在此类中的任何重载方法中使用了泛型,例如int addNotes(Collection<Object> notes)void addNotes(List<Note> notes),这两个会变成int addNotes(Collection notes)void addNotes(List notes),这可能会改变解决方案的工作方式。

此外,由于原始类型缺少其他类型信息,因此依赖于通用技巧的代码将无法编译。例如,类Class<T>是使用它所代表的类进行参数化的泛型类。因此,您可以定义将Class<T>实例作为参数并返回T的方法,因为它们知道它是您传递的同一个类。如果you save it to a variable of type Class (no type parameter),方便的代码将无法以一种模糊的方式编译。

答案 2 :(得分:0)

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

创建参数化类型的ResultCard

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

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

ResultCard rawResultCard = ResultCard();

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

你知道吗!!!! 我们没有将List类作为泛型。但是在一段时间之后它被赋予对通用List.so的支持以实现向后兼容性,但仍然可以使用List。

这里指定了paramitrized类型,它允许使用Bike Class参数对其进行实例化,并允许调用该方法。

但是如果它本来是其他一些不扩展Bike类的类,那么它会给编译时错误。