返回不同类型的方法?

dzi*_*iki 3 java collections iterator

我正在写一个方法.

这是层次结构树:

IProtocoll
|
|--ProtocolImpl1
|
|--ProtocolImpl2
|
|--ProtocolImpl3
Run Code Online (Sandbox Code Playgroud)

该方法本身如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

和用法示例.

List<IProtocol> list = ProtocolHelper.getrProtocolsByType("PROTOCOL1", trx)

for (IProtocol protocol : list) {
    ProtocolHelper.createProtocolType1((ProtocolImpl1) protocol)
}
Run Code Online (Sandbox Code Playgroud)

现在 - 如在类型层次结构中所见 - 这种方法可以返回3种可能性.

String type正在定义应返回什么类型的协议.trx.getProtocols()将返回包含所有3种类型协议的迭代器.

有没有办法以某种方式统一这个方法,它将返回这3种类型中的一种,而不使用以后使用该方法时不必要的转换?

Tho*_*mas 6

您可以尝试以下方法:

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)
Run Code Online (Sandbox Code Playgroud)

因此,不是将类型作为字符串传递,而是传递您想要获得的实现类.

演员(T)p是必要的,但既然你检查了p类型T或子类型,这是安全的.