我有那些课。

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"); )

10-07 13:57