为什么Java模板约束在返回语句中将受约束类型限制为扩展类型?

为什么Java模板约束在返回语句中将受约束类型限制为扩展类型?,java,Java,我有这样的代码: public class Something<T extends Thing> { private T theThing; public Something(T aThing) { theThing = aThing; } public T getTheThing() { return theThing; } } 特殊训练班: public abstract class Thing {

我有这样的代码:

public class Something<T extends Thing> {

    private T theThing;

    public Something(T aThing) {
        theThing = aThing;
    }

    public T getTheThing() {
        return theThing;
    }
}
特殊训练班:

public abstract class Thing {
}
public class SpecialThing extends Thing {
}

原因是您使用的是对
某物的原始类型引用。这意味着Java唯一可以确定的是返回的类型扩展了
thing
,因此这就是您得到的类型

添加如下类型参数以返回一个
SpecialThing

Something<SpecialThing> something = new Something<SpecialThing>(new SpecialThing()); 
SpecialThing specialThing = something.getTheThing();
Something=newsomething(newspecialthing());
SpecialThing SpecialThing=something.getTheThing();

因为您没有在变量声明中指定类型。您可能已经用
SpecialThing
对其进行了实例化,但这不是您记忆它的方式

您会注意到,当您使用此选项时,它会起作用

Something<SpecialThing> something = new Something<SpecialThing>(new SpecialThing());
Something=newsomething(newspecialthing());
这与定义
ArrayList t=new ArrayList()相同。这仍将被视为
ArrayList
,而不是
ArrayList


.

提供物品和特殊类别代码。
Something<SpecialThing> something = new Something<SpecialThing>(new SpecialThing());