为什么我的泛型类的构造函数拒绝采取执行所请求的接口

问题描述:

我有一个通用的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>

我在做什么错在这里?

+0

@KevinEsche哦,对不起,我忘了让他们都公开,代码是从一个简短的自我包含的例子中,我让他们所有的私人我内尔班。我相应地编辑了我的答案 – FelixZett

错误信息清楚:在Java中的List<SpecialItem>不符合List<Item>即使SpecialItem确实是一种Item兼容。在Java泛型是不变的,所以在这种情况下,你有两个选择:

  • (不推荐)宣布List<Item>dateTimeList - 它允许你添加SpecialItem并与构造函数签名

  • 兼容修改构造函数签名接受List<? extends Item<?>>

+0

你能指点我一个方向如何转换类型List >扩展到列表>,因为我确实需要SpecialItemProvider的泛型 – FelixZett