我使用的是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<?>>
)的定义不同。
我可以通过强制转换或不使用通配符来防止错误。但我想知道的是: