为什么我的泛型类的构造函数拒绝采取执行所请求的接口
问题描述:
我有一个通用的Item
- 接口和一个日期属性,像这样的实施对象:为什么我的泛型类的构造函数拒绝采取执行所请求的接口
public interface Item<T extends Temporal> {
T getDate();
}
public class SpecialItem implements Item<LocalDateTime> {
private final LocalDateTime localDateTime;
public SpecialItem(LocalDateTime localDateTime) {
this.localDateTime = localDateTime;
}
@Override
public LocalDateTime getDate() {
return localDateTime;
}
}
现在我有一个供应商类和接口说Item
public interface ItemProvider<T extends Temporal> {
List<Item<T>> getEntries();
}
public class SpecialItemProvider<T extends Temporal> implements ItemProvider<T> {
private final List<Item<T>> entries;
public SpecialItemProvider(List<Item<T>> entries) {
this.entries = entries;
}
@Override
public List<Item<T>> getEntries() {
return entries;
}
}
我有我真的不能叫SpecialItemProvider
像这样的构造函数的问题(我真的想ItemProvider
类型的对象):
@Test
public void genericTest(){
final List<SpecialItem> dateTimeList =
Collections.singletonList(new SpecialItem(LocalDateTime.MAX)));
ItemProvider itemProvider = new SpecialItemProvider<LocalDateTime>(dateTimeList);
}
它总是失败,出现以下错误信息:
java: incompatible types: java.util.List<GenericTest.SpecialItem>
cannot be converted to java.util.List<GenericTest.Item<java.time.LocalDateTime>>
这使我想知道为什么它不被接受,尽管SpecialItem
明确实现Item<LocalDateTime>
我在做什么错在这里?
答
错误信息清楚:在Java中的List<SpecialItem>
不符合List<Item>
即使SpecialItem
确实是一种Item
兼容。在Java泛型是不变的,所以在这种情况下,你有两个选择:
(不推荐)宣布
List<Item>
型dateTimeList
- 它允许你添加SpecialItem
并与构造函数签名兼容修改构造函数签名接受
List<? extends Item<?>>
+0
你能指点我一个方向如何转换类型List >扩展到列表
@KevinEsche哦,对不起,我忘了让他们都公开,代码是从一个简短的自我包含的例子中,我让他们所有的私人我内尔班。我相应地编辑了我的答案 – FelixZett