带有通配符的Java泛型类型会导致错误,但仅限于Eclipse 4.7.0

时间:2017-07-21 15:18:58

标签: java eclipse generics java-8 eclipse-oxygen

我使用的是java版本1.8.0_121。我在Eclipse 4.7.0中遇到过这个问题,但在Eclipse 4.6.3中却没有。这个问题更多的是关于找出存在差异的原因以及是否存在错误而不是修复代码。从gradle编译时没有错误。

我有以下界面:

public interface IPredicateFactory
{
    public <P extends IPredicate<T>, T> IPredicate<T> createPredicateForClass(
            final Class<P> predicateClass);
}

这个代码调用接口方法:

public final class PredicateExecutor
{
    private IPredicateFactory predicateFactory;

    // some more code...

    @SuppressWarnings("unchecked")
    private final <T> IPredicate<T> createPredicate(
            final Class<? extends IPredicate<?>> predicateClass)
    {
        assert predicateFactory != null : "Unspecified predicate factory";
        final IPredicate<?> predicate = predicateFactory.createPredicateForClass(predicateClass);
        assert predicate != null : "Predicate factory should not return a null predicate";
        return (IPredicate<T>) predicate;
    }

}

Eclipse 4.7.0给了我这个错误:

The method createPredicateForClass(Class<P>) in the type IPredicateFactory is not applicable for the arguments (Class<capture#1-of ? extends IPredicate<?>>)

我知道接口中的参数类型(Class<P><P extends IPredicate<T>>)和传递的对象类型(Class<? extends IPredicate<?>>)的定义不同。

我可以通过强制转换或不使用通配符来防止错误。但我想知道的是:

  • 我的代码中是否存在实际错误?如果是这样,为什么它甚至从gradle编译?
  • 为什么只在Eclipse 4.7.0中发生错误?
  • 我可以在java / Eclipse端做些什么来阻止它吗?

0 个答案:

没有答案