我有这些课程。
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>
它的工作原因,为什么?
答案 0 :(得分:9)
List<FlightOffer> flightOffers
非常清楚地定义了您可以添加到列表中的内容:FlightOffer
的实例。由于flightOffers.add(new BaseOffer());
不是 BaseOffer
,FlightOffer
因此无效。
为什么hotelOffers.add(new BaseOffer());
有效?因为您使用Hotel
中的原始类型Hotel hotelObject = new Hotel<String>();
禁用泛型类型检查。
你应该收到关于这个的警告,这也传达了另一个教训:不要忽视这些警告。编译器并不知道 会失败的东西,但往往是错误的#猜测&#34;正确并警告你。
修改强>
注意原始类型的JLS状态(在4.8节的第一个框中):
上述规则的另一个含义是原始类型的通用内部类本身只能用作原始类型。
这意味着因为Hotel
是原始类型,所以其中的每个泛型类型也只能是原始类型,即hotelOffers
被视为原始List
允许任何类型的对象(因此即使这应该在您的代码中hotelObject.hotelOffers.add("I'm not a hotel offer");
)
答案 1 :(得分:1)
您正尝试在BaseOffer
个List
(子类)对象中添加FlightOffer
个对象(超类)。
https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
Flight flightObject = new Flight();
flightObject.flightOffers.add(new FlightOffer()); // that's correct