通用接口问题
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
具有两个参数 ABC
和 DEF
。你的意思是填Response
class.
的参数
相反,您应该执行以下操作:
public class EmployeeDetail implements Response<ABC, DEF> {
表示EmployeeDetail
填写Response
接口的参数
你很接近,但你正在用泛型遮蔽 类。
此声明(删除了多余的 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>
- 它们也是通用的。不要使用原始类型。
我在通用实施方面遇到了一个问题。下面是代码:
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
具有两个参数 ABC
和 DEF
。你的意思是填Response
class.
相反,您应该执行以下操作:
public class EmployeeDetail implements Response<ABC, DEF> {
表示EmployeeDetail
填写Response
接口的参数
你很接近,但你正在用泛型遮蔽 类。
此声明(删除了多余的 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>
- 它们也是通用的。不要使用原始类型。