java泛型绑定不匹配:类型不是绑定参数的有效替代品 公共类XYZ{ 公共静态void main(字符串[]args){ C=新的D();

java泛型绑定不匹配:类型不是绑定参数的有效替代品 公共类XYZ{ 公共静态void main(字符串[]args){ C=新的D();,java,generics,Java,Generics,我得到一个错误:::绑定不匹配:类型A不是类型C的绑定参数的有效替代品。我做错了什么? } public class XYZ { public static void main(String[] args) { C<A> c = new D<A>(); } 类D实现C{ @凌驾 公共无效ok(T b){ System.out.println(b.getId()); } } 接口C{ 无效ok(TB); } A类延伸至B类{ }

我得到一个错误:::绑定不匹配:类型A不是类型C的绑定参数的有效替代品。我做错了什么? }

    public class XYZ {
      public static void main(String[] args) {

        C<A> c = new D<A>();
}
类D实现C{
@凌驾
公共无效ok(T b){
System.out.println(b.getId());
}  
}
接口C{
无效ok(TB);
}
A类延伸至B类{
}
B类{
私人T-id;
公共T getId(){
返回id;
}
公共无效设置id(T id){
this.id=id;
}
}

您必须使用通配符
B
。问题是
C
。你给C和B的类型是
T
。但是您声明
C
。因此,在您的情况下,
B
也会获取类型
A
,但您的代码表示
类A扩展了B
,其中
B
必须是
字符串。
D
中也存在同样的问题。希望我的答案是清楚的

以下代码应适用于您:

    }

    class D<T extends B<T>> implements C<T>{
      @Override
      public void ok(T b) {
        System.out.println(b.getId());   
      }  
    }

    interface C<T extends B<T>>{
      void ok(T b);
    }

    class A extends B<String>{
    }

    class B<T>{
      private T id;

      public T getId() {
        return id;
      }

      public void setId(T id) {
        this.id = id;
      }

    }
publicstaticvoidmain(字符串[]args){
C t=新的D();
}
静态D类>{
无效ok(TB);
}
静态类A扩展了B{
}
静态B类{
私人T-id;
公共T getId(){
返回id;
}
公共无效设置id(T id){
this.id=id;
}
}
public static void main(String[] args) {

    C<A> t = new D<A>();
}

static class D<T extends B<?>> implements C<T> {
    @Override
    public void ok(T b) {
        System.out.println(b.getId());
    }
}

interface C<T extends B<?>> {
    void ok(T b);
}

static class A extends B<String> {
}

static class B<T> {
    private T id;

    public T getId() {
        return id;
    }

    public void setId(T id) {
        this.id = id;
    }

}