我有那些课。
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
中使用原始类型 Hotel hotelObject = new Hotel<String>();
来禁用泛型类型检查。
您还应该收到关于此的警告,这传达了另一个教训:不要忽略警告。编译器不知道某些事情会失败,但它通常会正确“猜测”并警告您。
编辑:
请注意 JLS 对原始类型的说明(在第 4.8 节的第一个框中):
这意味着因为 Hotel
是一个原始类型,它里面的每个泛型类型也只能是一个原始类型,即 hotelOffers
被视为原始 List
,它允许任何类型的对象(因此即使这应该在你的代码中工作 hotelObject.hotelOffers.add("I'm not a hotel offer");
)