基于通用列表元素的类型调用方法

时间:2016-05-30 13:15:46

标签: java generics

我有一个List定义了泛型。此列表中的所有元素都定义了接口TransferableData。根据最终填充列表的对象,我想调用一个方法来处理数据。

所以我想存档这样的东西:

private <T extends TransferableData> String doSomething(List<T> data, Class<T> dataType){
    if(returnType.equals(A.class)){
       for(T singleElement : data){
          ((A)singleElement).methodInsideA();
       }
    }else if(returnType.equals(B.class)){
       for(T singleElement : data){
          ((B)singleElement).methodInsideB();
       }
   }
}

我意识到这不是这样做的方法。如果没有所有if-else和未经检查的演员,我就找不到合适的方法。

2 个答案:

答案 0 :(得分:0)

根据Mena的评论,您可以尝试这样的事情,

public interface TransferableData {

    void genericInvoker();
}


public class A implements TransferableData {

    @Override
    public void genericInvoker() {
        methodInsideA();
    }

    void methodInsideA(){
        // Do specific thing to A
    }
}

public class B implements TransferableData {

    @Override
    public void genericInvoker() {
        methodInsideB();
    }

    void methodInsideB(){
        // Do specific thing to B
    }
}

然后您可以按如下方式调用方法:

private <T extends TransferableData> String doSomething(List<T> data, Class<T> dataType){

  for(T singleElement : data){
      singleElement.genericInvoker();
  }

  //Don't forget to return a String from this method
}

答案 1 :(得分:0)

基于您的类正在实现TransferableData接口的假设,您可以添加一个方法invokeMethod(),该方法具有返回类型的void。对于下面的解决方案,您应该在所有类中使用相同的方法签名。

public interface TransferableData {
    void invokeMethod();
}


public class A implements TransferableData {

   @Override
   public void invokeMethod() {
        //Your business logic A
   }
}

public class B implements TransferableData {

    @Override
    public void invokeMethod() {
        //Your business logic for B
    }
}

将对象列表迭代为(无需将dataType传递给此方法):

private <T extends TransferableData> String doSomething(List<T> data) {

  for(T object: data){
      object.invokeMethod();
  }
  //return the string according to your business logic.
}