Java Generics捕获错误"?超级捕获#1?超级T"

时间:2014-09-22 15:30:08

标签: java generics

这是一个简化的,虚构的场景,旨在展示我的问题。

我想创建一个interface MarketingScheme<T>,其中包含一组实现interface MarketingCustomers<? super T>的参与者。例如,我可能有一个专为车辆设计的营销方案,其中汽车的营销客户可能是参与者。我有另一个界面,Manufacturer<R> extends MarketingCustomer <R>,所以汽车制造商也是汽车的营销客户。

我的MarketingScheme接口定义了一个方法public void addParticipant(MarketingCustomer<?super T> customer);。我希望能够将MarketingCustomer<Car>添加到MarketingScheme<Vehicle>,假设Car是Vehicle的子类。可能有很多方案,所以我应该能够将同一个制造商添加到MarketingScheme<DurableGood>,假设Vehicle extends DurableGood

如果我创建一个ManufacturerImpl并按如下方式传递MarketingScheme:

    public class ManufacturerImpl<R> implements Manufacturer<R>
{
    public ManufacturerImpl(MarketingScheme<? super R> scheme) {
        super();
        scheme.addParticipant(this);
    }
}

......我收到了错误

The method addParticipant(MarketingCustomer<? super capture#1-of ? super R>) in the type MarketingScheme<capture#1-of ? super R> is not applicable for the arguments (ManufacturerImpl<R>)

我已经阅读了Generic Methods(helperMethods)并试图实现一个,但我无法做到正确。我已经考虑过向接口添加一个额外的类型声明,但是在我的模型中没有编译或看起来合适。我也找不到任何在我的addParticipant电话里面工作的演员阵容。

我的界面定义如下......

    public interface MarketingScheme<T>
{
    public void addParticipant(MarketingCustomer<? super T> customer);

}

public interface MarketingCustomer<S>
{

}

public interface Manufacturer<R> extends MarketingCustomer<R>
{

}

您的回答非常感谢。谢谢。

2 个答案:

答案 0 :(得分:1)

您需要更改addParticipant的类型签名:

public void addParticipant(MarketingCustomer<? extends T> customer);

这是因为客户的类型参数应该是T的子类,而不是超类。

答案 1 :(得分:0)

将其更改为

public interface MarketingScheme&lt; T&gt; {

public void addParticipant(MarketingCustomer&lt;&lt;?extends T&gt; customer);

}