繁体   English   中英

Java无法在列表中添加对象而不使用泛型

[英]Java cant adding object in list without generic

我有这些课程。

public class Flight {
    public List<FlightOffer> flightOffers;
}

public class Hotel<T> {
    public List<HotelOffer> hotelOffers;
    public T address
}

public class FlightOffer extends BaseOffer{
}

public class HotelOffer extends BaseOffer{
}

public class BaseOffer{
    public String id;
}

flightOffers和hotelOffers返回一个列表。

Flight flightObject = new Flight();
flightObject.flightOffers.add(new BaseOffer()); // not working 
//(add (FlightOffer) List  cannot be applied to (BaseOffer))

Hotel hotelObject = new Hotel<String>();
hotelObject.hotelOffers.add(new BaseOffer()); // working

但如果我将Flight转换为Flight<T>其工作,为什么?

List<FlightOffer> flightOffers非常清楚地定义了您可以添加到列表中的内容: FlightOffer实例。 flightOffers.add(new BaseOffer()); 因此,由于BaseOffer 不是 FlightOffer因此无法工作。

那么为什么hotelOffers.add(new BaseOffer()); 工作? 因为您使用Hotel hotelObject = new Hotel<String>();的原始类型Hotel禁用泛型类型检查Hotel hotelObject = new Hotel<String>();

你应该得到一个警告,这也传达了另一个教训:不要忽视警告。 编译器不知道某些东西失败,但更多时候它会正确“猜测”并警告你。

编辑:

注意JLS在原始类型上的含义(在4.8节的第一个框中):

上述规则的另一个含义是原始类型的通用内部类本身只能用作原始类型。

这意味着因为Hotel是一个原始类型,所以它里面的每个泛型类型也只能是一个原始类型,即hotelOffers被视为原始List ,允许任何类型的对象(因此即使这应该在你的代码hotelObject.hotelOffers.add("I'm not a hotel offer");

您正在尝试在FlightOffer (子类)对象的List中添加BaseOffer对象(超类)。

https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

Flight flightObject = new Flight();
flightObject.flightOffers.add(new FlightOffer());    // that's correct

暂无
暂无

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

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