【发布时间】:2016-05-03 14:35:20
【问题描述】:
我正在尝试将 Java 接口用作 D 类型的一些高级包装器中的 mixins。
interface WrapsD {
D getWrapped();
}
interface FeatureA extends WrapsD {
default ...
}
interface FeatureB extends WrapsD {
default ...
}
abstract class DWrapperFactory<T extends WrapsD> {
protected T doWrap(D d) {
return () -> d; // <- does not work
}
}
interface FeatureAB extends FeatureA, FeatureB {
}
class ProducingDWithFeatureAB extends DWrapperFactory<FeatureAB> {
protected FeatureAB doWrap(D d) {
return () -> d; // <- has to repeat this
}
}
正如ProducingDWithFeatureAB 中所见,doWrap 必须在每个子类中实现,即使主体相同。 (Java 泛型为什么真的被破坏的另一个例子。)
由于其他原因我已经需要创建像 ProducingDWithFeatureAB 这样的具体类,并且 JRE 中存在用于合成 lambda 类的代码,所以应该可以使用反射只编写一次 doWrap。我想知道怎么做。
(doWrap 过去是使用匿名内部类实现接口的,这更加生物模板。)
【问题讨论】:
-
泛型类型在编译时由于类型擦除而被擦除。因此,在这种情况下,您要使用的通用方法/lambda 可能无法实现。
-
@callyalater 我已经必须为每个不同的
T创建一个子类,因此可以保证该类型可以通过反射获得。我只是想避免一次又一次地复制fun()的实现,只是为了使类型工作...... -
匿名本地类中要替换什么样的代码?
-
你期望它的表现如何?
-
您能否提供您尝试重构的示例代码?我看不到通用
T可以如何由匿名类实现,除非使用未经检查的强制转换(然后问题实际上就在那里)。
标签: java generics lambda java-8