【发布时间】:2015-12-11 17:11:59
【问题描述】:
我正在构建一种框架以避免重复代码,并且在某个时候我需要将对象 Foo 的列表转换为对象 Bar 的列表。
我有扩展的数据库实体
public class BaseEntity {...}
以及扩展的表示对象
public class BaseDTO<T extends BaseEntity> {...}
所以
public class Foo extends BaseEntity {...}
和
public class Bar extends BaseDTO<A extends BaseEntity> {
public Bar(Foo entity, Locale l) {
...
}
}
现在使用流很容易将 Foo 列表转换为 Bar 列表
public abstract ClassThatUsesFooAndBar() {
public List<Bar> convertFooToBar(List<Foo> list) {
return list.stream().map(f -> new Bar(f, locale)).collect(...);
}
}
但是,问题来了,这些 Foo 和 Bar 实际上是泛型(A 和 B),所以使用 Foo 和 Bar 的类实际上是 ClassThatUsesAandB<A extends BaseEntity, B extends BaseDTO>,所以该函数也必须是抽象的并作为样板代码实现使用正确的 A 和 B 实现,因为显然您无法实例化泛型类型。
有没有办法使用泛型/流/lambdas 来创建一个可以编写一次的函数,从而实现类不需要重新实现它?函数签名将是
public List<B> convertAToB(List<A> list);
我希望我已经足够清楚我需要什么,如果您需要进一步的解释,请询问
谢谢!
【问题讨论】:
-
请不要使用单字母类名,因为很难将它们与类型参数区分开来。如果您对随机名称感到困惑,可以使用
Foo、Bar或Baz。 -
实际上我使用了 A 和 B 因为在讨论结束时它们实际上是类型参数。我会尝试改写...
-
您能更具体地了解泛型的使用吗?你写 A/B 扩展 AnObject,但在你的例子中 A/B 没有扩展任何东西
-
我正在重新表述我的问题以使其更清楚:)
标签: java generics lambda java-stream