Java 泛型捕获错误"? super capture#1 of ? super T"



这是一个简化的、捏造的场景,旨在演示我的问题

我想创建一个interface MarketingScheme<T>,它将有一个实现interface MarketingCustomers<? super T>的参与者集合。举个例子,我可能有一个为汽车设计的营销方案,其中汽车的营销客户可能是参与者。我有另一个接口Manufacturer<R> extends MarketingCustomer <R>,所以汽车制造商也是汽车的营销客户

My MarketingSchema接口定义了一个方法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>)

我已经阅读了泛型方法(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的子类,而不是超类。

将其更改为

公共接口MarketingScheme<T>{

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

}

最新更新