关于java中的泛型和列表

时间:2014-06-18 18:39:09

标签: java list generics

我有这个简单的界面:

public interface Transportable<T> { 
  public T getTransport();
}

以及许多提供实现的类,即:

class A implements Transportable<ATransport> {
  public ATransport getTransport() {
    ATransport at=new ATransport();
    [...]
    return at;
  }
}
class B implements Transportable<BTransport> {
  public BTransport getTransport() {
    BTransport bt=new BTransport();
    [...]
    return bt;
  }
}

我也列出了可移动对象列表,如下所示:

LinkedList<A> aList=new LinkedList<>();

我想为aList中的所有元素调用getTransport方法,获取LinkedList,做类似的事情:

LinkedList<ATransport> atList = getTransport(aList);
LinkedList<BTransport> btList = getTransport(bList);

我不想为我所拥有的每个课程编写一个foreach,有没有办法使用泛型来实现它?像:

public <T> List<???> getTransport(List<T> list)

或类似的东西?我已经尝试但没有运气,我想我错过了关于仿制药和使用等等之间的区别......

谢谢!

1 个答案:

答案 0 :(得分:2)

这似乎有效:

package dummy;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

class ATransport{}
class BTransport{}
class A implements Transportable<ATransport> {
  public ATransport getTransport() {
    ATransport at=new ATransport();
    return at;
  }
}
class B implements Transportable<BTransport> {
  public BTransport getTransport() {
    BTransport bt=new BTransport();
    return bt;
  }
}
class X {
    public static <U, T extends Transportable<U>> List<U> getTransport(List<T> list) {
        List<U> ret = new LinkedList<>();
        for (T t : list) {
            ret.add(t.getTransport());
        }
        return ret;
    }

    public static void main(String[] args) {
        List<BTransport> transportsB = getTransport(Collections.singletonList(new B()));
        List<ATransport> transportsA = getTransport(Collections.singletonList(new A()));
    }
}

这背后的想法是我们命名我们需要的类型和我们得到的。唯一的技巧是创建一个static方法,因此类型推断在那里工作。 (就像在Collections.singletonList电话中一样。)

编辑: This是泛型的教程,用于解释static方法技巧和其他一些类型推断用例。 This似乎是仿制药的有用资源。基本的想法(命名其他类型并在边界中使用)可能有一个我不知道的更通用的名称,抱歉没有给出引用。