我有一个通用类:
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时没有指定泛型类型有什么问题吗?我误解了什么吗?
谢谢。
答案 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类的类,那么它会给编译时错误。