[英]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.