【发布时间】:2017-01-26 07:13:39
【问题描述】:
我有像这样的自界泛型:
public interface SelfConfigurable<E extends SelfConfigurable<E>> {
E configure(JsonObject settings);
}
还有另一个接口,也是泛型类型,扩展了我之前的接口:
public interface ConfigurableSegmentFilter<T> extends SegmentFilter<T>, SelfConfigurable<ConfigurableSegmentFilter<T>> {
}
我也有这样的实现
public abstract class ConfigurableSegmentFilterSkeleton<T> implements ConfigurableSegmentFilter<T> {
@Override
public ConfigurableSegmentFilter<T> configure(JsonObject settings) {
... }
}
我正在通过反射实例化对象,并希望在添加到列表之前对其进行配置:
List<ConfigurableSegmentFilter<?>> result = ...
ConfigurableSegmentFilter newFilter = Reflection.newInstance() + casting
result.add(newFilter.configure(...)); <-- compile error 'cannot be applien to SelfConfigurable' but why?
//when i call to configure directly i am getting:
SelfConfigurable configure = newFilter.configure(...) <-- why SelfConfigurable??
我得到一个编译错误!它告诉我 xxx.configure() 返回的是 SelfConfigurable 接口而不是 ConfigurableSegmentFilter,我不明白为什么会这样。
还有一件事,当我用通配符绑定 newFilter 时,事情开始按预期工作
List<ConfigurableSegmentFilter<?>> result = ...
ConfigurableSegmentFilter<?> newFilter = ... //<-- bound with <?>
result.add(newFilter.configure(...)); <-- No error! But why?
ConfigurableSegmentFilter vs ConfigurableSegmentFilter<?>的唯一区别
【问题讨论】:
-
发生编译器错误是因为您使用的是原始类型。请参阅标题'原始类型是该类型的擦除'下的stackoverflow.com/a/2770692/2891664。
-
什么是
JinniSegmentFilter???? -
对不起,我错误地添加了它。我知道我使用的是原始类型,无论如何我无法理解它背后的逻辑。 ConfigurableSegmentFilter> 应该和 ConfigurableSegmentFilter
-
@Gelerion 不,ConfigurableSegmentFilter> 与 ConfigurableSegmentFilter
-
@Gelerion 我不得不说我很惊讶您在 result.add(...) 中没有收到错误。我认为编译器无法分辨出这两个“?”正在引用相同的类型。这真的是手头问题的所有相关代码还是您省略了一些?