有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果没有泛型,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) 个答案

  1. # 1 楼答案

    List<FlightOffer> flightOffers非常清楚地定义了可以添加到列表中的内容:FlightOffer的实例flightOffers.add(new BaseOffer());因此无法工作,因为aBaseOffer不是aFlightOffer

    那么hotelOffers.add(new BaseOffer());为什么有效呢?因为您正在使用Hotel hotelObject = new Hotel<String>();中的原始类型Hotel禁用泛型类型检查

    你也应该得到一个警告,这传达了另一个教训:不要忽视这些警告。编译器不知道某个东西失败,但它通常会正确地“猜测”并警告您

    编辑:

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

    Another implication of the rules above is that a generic inner class of a raw type can itself only be used as a raw type.

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