我面临着一般性实施的问题。以下是代码:
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任何想法,我犯了错误。感谢
答案 0 :(得分:3)
你很接近,但你正在使用泛型类型来遮蔽类。
此声明(删除了多余的public
):
public interface Response<S, T> {
void response(S data, T... arg);
}
采用任何类型S
和T
,因此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 -> XYZ
和T -> 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
具有两个参数ABC
和DEF
。您的意思是填充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>