我正在写一个方法。
这是层次结构树:
IProtocoll
|
|--ProtocolImpl1
|
|--ProtocolImpl2
|
|--ProtocolImpl3
方法本身是这样的:
public static List<IProtocol> getProtocolsByType(String type, Transaction trx) {
Iterator<IProtocol> protocols = trx.getProtocols();
List<IProtocol> protocolsList = new ArrayList<IProtocol>();
while (protocols.hasNext()) {
if (StringHeper.isEqual(protocolls.next().getProtocolType(), type) {
protocolsList.add(protocolls.next());
}
}
return protocolsList
}
以及用法示例。
List<IProtocol> list = ProtocolHelper.getrProtocolsByType("PROTOCOL1", trx)
for (IProtocol protocol : list) {
ProtocolHelper.createProtocolType1((ProtocolImpl1) protocol)
}
现在 - 如类型层次结构中所示 - 此方法可能返回 3 种可能性。
String type
定义应返回什么类型的协议(protocol)。 trx.getProtocols()
将返回一个包含所有 3 种协议(protocol)类型的迭代器。
有没有办法以某种方式统一此方法,使其返回这 3 种类型中的一种,而无需在以后使用该方法时使用不必要的转换?
最佳答案
您可以尝试以下方法:
public static <T extends IProtocol> List<T> getProtocolsByType(Class<T> typeClass, Transaction trx) {
Iterator<IProtocol> protocols = trx.getProtocols();
List<T> protocolsList = new ArrayList<T>();
while( protocols.hasNext() ) {
//call next() only once
IProtocol p = protocols.next();
//Check if p is an instance of typeClass or a subtype
if ( typeClass.isAssignableFrom( p.getClass() ) {
protocolsList.add( (T)p );
}
}
return protocolsList;
}
List<ProtocolImpl1> list = ProtocolHelper.getrProtocolsByType( ProtocolImpl1.class, trx)
因此,不是将类型作为字符串传递,而是传递您想要获取的实现类。
强制转换 (T)p
是必要的,但由于您检查 p
是否属于 T
类型或子类型,因此这是安全的。
关于java - 返回不同类型的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32371977/