这是一个简化的,伪造的场景,旨在演示我的问题。
我想创建一个interface MarketingScheme<T>,其中将包含实现interface MarketingCustomers<? super T>的参与者的集合。例如,我可能有一个针对车辆设计的营销方案,其中汽车的营销客户可能是参与者。我还有另一个接口Manufacturer<R> extends MarketingCustomer <R>,所以汽车制造商也是汽车的营销客户。
我的MarketingScheme接口定义了一个单一方法public void addParticipant(MarketingCustomer<?super T> customer);。假设Car是Vehicle的子类,我希望能够将MarketingCustomer<Car>添加到MarketingScheme<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>
{

}


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

最佳答案

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

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


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

10-08 18:58