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

Emr*_*can 4 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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但如果我转换FlightFlight<T>它的工作,为什么?

Tho*_*mas 9

List<FlightOffer> flightOffers很清楚地定义了你可以添加到列表中的内容:实例FlightOffer.flightOffers.add(new BaseOffer());因此不能工作,因为一个BaseOffer 是不是一个FlightOffer.

那为什么要hotelOffers.add(new BaseOffer());工作?因为您是通过原始类型禁用泛型类型检查HotelHotel hotelObject = new Hotel<String>();.

你应该得到一个警告,这也传达了另一个教训:不要忽视警告.编译器不知道某些东西失败,但更多时候它会正确"猜测"并警告你.

编辑:

注意JLS在原始类型上的含义(在4.8节的第一个框中):

上述规则的另一个含义是原始类型的通用内部类本身只能用作原始类型.

这意味着因为Hotel是原始类型,其中的每个泛型类型也只能是原始类型,即被hotelOffers视为原始类型List允许任何类型的对象(因此即使这应该在您的代码中工作hotelObject.hotelOffers.add("I'm not a hotel offer");)