如何使用具体参数进行子类化
How to Subclassing with Concrete Parameters
我有一个class事务和一个服务接口
public class Transaction {}
public interface RequestService {
public String getRequest(Transaction transaction);
}
现在我想子class 事务 class 并为服务接口 class 提供一个具体的 class
public class ESPTransaction extends Transaction {}
public class ESPRequestService implements RequestService {
@Override
public String getRequest(ESPTransaction espTransaction) {
StringBuffer buff = new StringBuffer(espTransaction.someMethodThatDoesntExistInParentClass());
return buff.toString();
}
}
IDE 抱怨说,即使 ESPTransaction subclasses Transaction,我也没有覆盖超类型方法。
我该如何实现?
正如 IDE 所指出的,ESPRequestService
没有正确实施 RequestService
,因为它没有 getRequest(Transaction)
方法。
一个简洁的解决方案是使接口通用,因此每个 RequestService
实现都可以指定它期望的 Transaction
类型:
public interface RequestService<T extends Transaction> {
public String getRequest(T transaction);
}
public class ESPRequestService implements RequestService<ESPTransaction> {
@Override
public String getRequest(ESPTransaction espTransaction) {
StringBuffer buff = new StringBuffer(espTransaction.someMethodThatDoesntExistInParentClass());
return buff.toString();
}
}
我有一个class事务和一个服务接口
public class Transaction {}
public interface RequestService {
public String getRequest(Transaction transaction);
}
现在我想子class 事务 class 并为服务接口 class 提供一个具体的 class
public class ESPTransaction extends Transaction {}
public class ESPRequestService implements RequestService {
@Override
public String getRequest(ESPTransaction espTransaction) {
StringBuffer buff = new StringBuffer(espTransaction.someMethodThatDoesntExistInParentClass());
return buff.toString();
}
}
IDE 抱怨说,即使 ESPTransaction subclasses Transaction,我也没有覆盖超类型方法。
我该如何实现?
正如 IDE 所指出的,ESPRequestService
没有正确实施 RequestService
,因为它没有 getRequest(Transaction)
方法。
一个简洁的解决方案是使接口通用,因此每个 RequestService
实现都可以指定它期望的 Transaction
类型:
public interface RequestService<T extends Transaction> {
public String getRequest(T transaction);
}
public class ESPRequestService implements RequestService<ESPTransaction> {
@Override
public String getRequest(ESPTransaction espTransaction) {
StringBuffer buff = new StringBuffer(espTransaction.someMethodThatDoesntExistInParentClass());
return buff.toString();
}
}