为什么我不能将子列表传递给接受List <! - 的方法?扩展父 - >?

时间:2014-07-21 22:21:43

标签: java generics

我有一个名为FamilyHistoryPersonModel的类,它扩展了一个名为PersonModel的类。

    MapValue mapValue = new MapValue("relatives",
            new GenericType<FamilyHistoryPersonModel>() {},
            new GenericType<List<FamilyHistoryPersonModel>>() {}  //error here
    );

构造

    private MapValue(String pluralUrl, GenericType<? extends PersonModel> singleResultGenericType, GenericType<List<? extends PersonModel>> listResultGenericType) {
        this.pluralUrl = pluralUrl;
        this.singleResultGenericType = singleResultGenericType;
        this.listResultGenericType = listResultGenericType;
    }

错误:

cannot find symbol
symbol  : constructor MapValue(java.lang.String,<anonymous com.sun.jersey.api.client.GenericType<com.models.FamilyHistoryPersonModel>>,<anonymous com.sun.jersey.api.client.GenericType<java.util.List<com.models.FamilyHistoryPersonModel>>>)
location: class com.rest.v2.resource.CreatePersonModelIntegrationTest.MapValue

为什么我收到此错误?我如何解决它?我不想更改构造函数以接受GenericType<List<FamilyHistoryPersonModel>> listResultGenericType

我正在使用JDK 1.6

1 个答案:

答案 0 :(得分:5)

正如List<Dog>即使List<Animal>子类Animal不是Dog一样,GenericType<List<FamilyHistoryPersonModel>>也不是GenericType<List<? extends PersonModel>>,即使List<FamilyHistoryPersonModel>List<? extends PersonModel>

解决方案是在顶级泛型类型参数中提供通配符。在MapValue构造函数中,从

更改参数
GenericType<List<? extends PersonModel>> listResultGenericType

GenericType<? extends List<? extends PersonModel>> listResultGenericType

我认为您还需要更改this.listResultGenericType的匹配类型。