java - 关于java中的泛型和列表

标签 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)

或者类似的东西?我已经尝试过,但没有运气,我想我错过了一些关于泛型以及使用或等之间的区别的东西......

谢谢!

最佳答案

这似乎有效:

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()));
    }
}

这背后的想法是我们命名我们需要的类型和我们得到的内容。唯一的技巧是创建为静态方法,这样类型推断就可以在那里工作。 (就像在 Collections.singletonList 调用中一样。)

编辑: This是一个泛型教程,解释了静态方法技巧和一些其他类型推断用例。 This似乎是泛型的有用资源。基本思想(命名其他类型并在绑定(bind)中使用)可能有一个我不知道的更通用的名称,很抱歉没有提供对此的引用。

关于java - 关于java中的泛型和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24292827/

相关文章:

java - 如何将一个 HashMap 列表中的不同值添加到另一个 HashMap 列表

c# - 如何动态调用通用扩展方法?

java - Map 中 Set 的通配符 - 返回类型不兼容 - 为什么?

c# - List<T>.AsReadOnly() 与 IReadOnlyCollection<T>

java - 创建类的对象,而不是通过构造函数

java JFrame getLocationOnScreen 返回错误结果? @Ubuntu

java - 半透明窗口内的半透明 JPopupMenu - 替代方案?

使用 "this"关键字时 Java 隐式调用 toString()

java - 使用binarySearch从ArrayList中删除单词

python - 如何在列表理解中将字典值转换为小写?