通用接口问题

Issue with Generic interface

我在通用实施方面遇到了一个问题。下面是代码:

public interface Response<S, T> {

 public void response(S data, T... arg);
}

public class CustomerDetail<XYZ, PQR> implements Response<XYZ, PQR> {
  @Override
  public void response(XYZ data, PQR... args) {
    PQR request = args[0];
    Map reportMap = data.any();
    //do something
  }
}


public class EmployeeDetail<ABC, DEF> implements Response<ABC, DEF> {
  @Override
  public void response(ABC data, DEF... args) {
     List reportList = data.getDetails();
    //do something
  }
}

此外,class XYZ、ABC 如下所示:

public class XYZ {
   public Map any() {
     //do something
     return mapObject;
  }
}

public class ABC {
   public List getDetails() {
     //do something
     return listObject;
  }
}

在编译过程中,出现编译错误:

cannot find method any();
cannot find the method getDetails();

早些时候我尝试使用这段代码,它运行良好:

public class CustomerDetail<S, T> implements Response<S, T> {
  @Override
  public void response(S data, T... args) {
    PQR request = (PQR)args[0];
    Map reportMap = ((XYZ)data).any();
    //do something
  }
}


public class EmployeeDetail<S, T> implements Response<S, T> {
  @Override
  public void response(S data, T... args) {
     List reportList = ((ABC)data).getDetails();
    //do something
  }
}

但我不想对泛型变量进行类型转换。所以我遵循了上述方法。我试着按照 link 任何想法,我在哪里犯了错误。谢谢

变化:

public class CustomerDetail<XYZ, PQR> implements Response<XYZ, PQR>

收件人:

public class CustomerDetail implements Response<XYZ, PQR>

并更改:

public class EmployeeDetail<ABC, DEF> implements Response<ABC, DEF>

至:

public class EmployeeDetail implements Response<ABC, DEF>

您实现接口的 classes 不是泛型 classes。所以你不应该提供参数:

public class EmployeeDetail<ABC, DEF> implements Response<ABC, DEF> {

这使得泛型 class EmployeeDetail 具有两个参数 ABCDEF。你的意思是填Responseclass.

的参数

相反,您应该执行以下操作:

public class EmployeeDetail implements Response<ABC, DEF> {

表示EmployeeDetail填写Response接口的参数

你很接近,但你正在用泛型遮蔽 类。

此声明(删除了多余的 public):

public interface Response<S, T> {
    void response(S data, T... arg);
}

接受任何类型ST,所以这个class:

public class CustomerDetail<XYZ, PQR> implements Response<XYZ, PQR> {
  @Override
  public void response(XYZ data, PQR... args) {
    PQR request = args[0];
    Map reportMap = data.any();
    //do something
  }
}

仅仅重新定义泛型类型变量S -> XYZT -> ABC。您没有在此处指定具体类型,您只是定义了恰好与 类.

同名的通用类型变量

如果您希望 class 扩展 特定的 通用类型,它不应该有类型定义:

public class CustomerDetail implements Response<XYZ, PQR> {
  @Override
  public void response(XYZ data, PQR... args) {
    PQR request = args[0];
    Map reportMap = data.any();
    //do something
  }
}

作为旁注,当你在玩泛型时,你应该知道 List 的定义是 List<E>Map 的定义是 Map<K, V> - 它们也是通用的。不要使用原始类型。