名称冲突 - 具有相同的擦除但都不覆盖方法参数泛型中的另一个

Pav*_*l_K 5 java generics

我已阅读有关的所有问题和答案,Name clash - have the same erasure yet neither overrides the other但仍然无法理解如何解决问题。所以,

@Dependent
public class SimpleFoo {}

@Dependent
public class AdvancedFoo extends SimpleFoo {}

@Dependent
public class Parent {

    @Inject
    protected void setFooInstance(Instance<? extends SimpleFoo> instance) {}
}

@Dependent
public class Child extends Parent {

    @Override
    protected void setFooInstance(Instance<AdvancedFoo> instance) {} //Error here
}
Run Code Online (Sandbox Code Playgroud)

如何解决?

dav*_*xxx 7

问题是该类Child声明重写以下方法:

@Override
protected void setFooInstance(Instance<AdvancedFoo> instance) {} //Error here
Run Code Online (Sandbox Code Playgroud)

但该类Parent声明了一个setFooInstance 具有不同签名的方法:

protected void setFooInstance(Instance<? extends SimpleFoo> instance) {}
Run Code Online (Sandbox Code Playgroud)

Child1)以这种方式覆盖该类:

public class Child extends Parent {

    @Override
    protected void setFooInstance(Instance<? extends SimpleFoo> instance){... }
}
Run Code Online (Sandbox Code Playgroud)

或2)其他方式:如果您想强制子类中的重写方法声明特定的方法SimpleFoo,请使该类成为Parent用其SimpleFoo或其子类参数化的泛型类:

@Dependent
public class Parent <T extends SimpleFoo>{

    @Inject
    protected void setFooInstance(Instance<T> instance) {...}
}
Run Code Online (Sandbox Code Playgroud)

现在Child可以声明该类:

@Dependent
public class Child extends Parent<AdvancedFoo> {

    @Override
    protected void setFooInstance(Instance<AdvancedFoo> instance) {...}  
}
Run Code Online (Sandbox Code Playgroud)