我有这个简单的界面:
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)
或类似的东西?我已经尝试但没有运气,我想我错过了关于仿制药和使用等等之间的区别......
谢谢!
答案 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似乎是仿制药的有用资源。基本的想法(命名其他类型并在边界中使用)可能有一个我不知道的更通用的名称,抱歉没有给出引用。