Generic接口问题

时间:2015-01-27 08:20:21

标签: java generics

我面临着一般性实施的问题。以下是代码:

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
  }
}

此外,类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任何想法,我犯了错误。感谢

3 个答案:

答案 0 :(得分:3)

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

此声明(删除了多余的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> - 他们& #39;也是通用的。不要使用原型。

答案 1 :(得分:2)

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

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

这使得通用类EmployeeDetail具有两个参数ABCDEF。您的意思是填充Response类的参数。

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

public class EmployeeDetail implements Response<ABC, DEF> {

这表示EmployeeDetail填充了Response接口的参数。

答案 2 :(得分:0)

变化:

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>