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

时间:2018-01-26 14:31:03

标签: java generics

我有这些课程。

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>它的工作原因,为什么?

2 个答案:

答案 0 :(得分:9)

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

为什么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)

您正尝试在BaseOfferList(子类)对象中添加FlightOffer个对象(超类)。

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

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