如果没有泛型,Java无法在列表中添加对象
我有这些课程
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>
它能工作,为什么
# 1 楼答案
List<FlightOffer> flightOffers
非常清楚地定义了可以添加到列表中的内容:FlightOffer
的实例flightOffers.add(new BaseOffer());
因此无法工作,因为aBaseOffer
不是aFlightOffer
那么
hotelOffers.add(new BaseOffer());
为什么有效呢?因为您正在使用Hotel hotelObject = new Hotel<String>();
中的原始类型Hotel
禁用泛型类型检查你也应该得到一个警告,这传达了另一个教训:不要忽视这些警告。编译器不知道某个东西会失败,但它通常会正确地“猜测”并警告您
编辑:
注意JLS在原始类型上的状态(在第4.8节的第一个框中):
这意味着,因为
Hotel
是一个原始类型,所以它内部的每个泛型类型也只能是一个原始类型,即hotelOffers
被视为一个原始的List
,它允许任何类型的对象(因此,即使这样也应该在代码hotelObject.hotelOffers.add("I'm not a hotel offer");
中工作)