Java 通用接口问题
我面临一个通用实现的问题。代码如下:Java 通用接口问题,java,generics,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) {
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
}
}
在编译过程中,我得到编译错误:
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
}
}
公共类CustomerDetail实现响应{
@凌驾
公共无效响应(S数据、T…参数){
PQR请求=(PQR)参数[0];
Map reportMap=((XYZ)数据).any();
//做点什么
}
}
公共类EmployeeDetail实现响应{
@凌驾
公共无效响应(S数据、T…参数){
List reportList=((ABC)数据).getDetails();
//做点什么
}
}
但是我不想要泛型变量的类型转换。因此,我采用了上述方法。我试着按照任何想法去做,在哪里我犯了错误。感谢更改:
public class CustomerDetail<XYZ, PQR> implements Response<XYZ, PQR>
公共类CustomerDetail实现响应
致:
公共类CustomerDetail实现响应
和变化:
public class EmployeeDetail<ABC, DEF> implements Response<ABC, DEF>
公共类EmployeeDetail实现响应
致:
公共类EmployeeDetail实现响应
更改:
public class CustomerDetail<XYZ, PQR> implements Response<XYZ, PQR>
公共类CustomerDetail实现响应
致:
公共类CustomerDetail实现响应
和变化:
public class EmployeeDetail<ABC, DEF> implements Response<ABC, DEF>
公共类EmployeeDetail实现响应
致:
公共类EmployeeDetail实现响应
实现接口的类不是泛型类。因此,您不应提供以下参数:
public class EmployeeDetail<ABC, DEF> implements Response<ABC, DEF> {
这表示
EmployeeDetail
填充响应
接口的参数。实现接口的类不是泛型类。因此,您不应提供以下参数:
public class EmployeeDetail<ABC, DEF> implements Response<ABC, DEF> {
这表示
EmployeeDetail
填充响应
界面的参数。您已接近,但正在使用泛型类型隐藏类
此声明(删除多余的public
):
只需重新定义泛型类型变量S->XYZ
和T->ABC
。这里没有指定具体的类型,只定义了与类同名的泛型类型变量
如果希望类
扩展特定的泛型类型,则该类不应具有类型定义:
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
}
}
公共类CustomerDetail实现响应{
@凌驾
公共无效响应(XYZ数据、PQR…参数){
PQR请求=参数[0];
Map reportMap=data.any();
//做点什么
}
}
作为补充说明,当您使用泛型时,您应该知道
List
的定义是List
,而Map
的定义是Map
——它们也是泛型的。不要使用rawtypes。您很接近,但您正在使用泛型类型隐藏类
此声明(删除多余的public
):
只需重新定义泛型类型变量S->XYZ
和T->ABC
。这里没有指定具体的类型,只定义了与类同名的泛型类型变量
如果希望类
扩展特定的泛型类型,则该类不应具有类型定义:
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
}
}
公共类CustomerDetail实现响应{
@凌驾
公共无效响应(XYZ数据、PQR…参数){
PQR请求=参数[0];
Map reportMap=data.any();
//做点什么
}
}
作为补充说明,当您使用泛型时,您应该知道
List
的定义是List
,而Map
的定义是Map
——它们也是泛型的。不要使用rawtypes。编译错误发生在哪一行代码上?内部EmployeeDetail
和CustomerDetail
可能重复,XYZ
和DEF
不表示类,它们表示类型参数。这就是为什么给不同的东西起相同的名字是个坏主意。你在这个网站上问了4个问题,但没有接受任何答案。请阅读并考虑接受您的问题的答案。哪一行代码是编译错误?内部可能的副本>代码>雇员详细信息< /代码>和<代码>客户详细信息< /代码>,代码> XYZ 和<代码> DEF不代表类,它们是类型参数。这就是为什么给不同的东西起相同的名字是个坏主意。你在这个网站上问了4个问题,但没有接受任何答案。请阅读并考虑接受你的问题的答案。
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 CustomerDetail implements Response<XYZ, PQR> {
@Override
public void response(XYZ data, PQR... args) {
PQR request = args[0];
Map reportMap = data.any();
//do something
}
}