JPA模糊方法调用是成员

时间:2016-08-05 18:57:29

标签: java jpa overloading ambiguous

CriteriaBuilder有重载方法isMember(...)

创建一个谓词,用于测试元素是否是集合的成员。

<E,C extends java.util.Collection<E>> 
Predicate isMember(E elem, Expression<C> collection) 

<E,C extends java.util.Collection<E>> 
Predicate isMember(Expression<E> elem, Expression<C> collection) 

以下调用出现了模糊的编译错误:

CriteriaBuilder.isMember((Expression<Object>)a, (Expression<Collection<Object>>)b);

成员类型可以是任何类型,因此它是对象类型。 怎么解决?感谢。

2 个答案:

答案 0 :(得分:1)

您可以声明一个(未经检查的)泛型类型来链接转换,也许在内部私有方法中,以避免其他调用者可见。这甚至可以编译:

CriteriaBuilder cb;
Object a;
Object b;

@SuppressWarnings("unchecked")
private <E> void isMember() {

    cb.isMember((Expression<E>) a, (Expression<? extends Collection<E>>) b);
}

虽然ab可以更好地作为类型Expression,和/或作为更局部范围的方法中的局部变量或参数。

答案 1 :(得分:0)

编译器的问题是(Expression<Object>)a也可能是E的实际类型Object。为了使方法运行,你必须避免演员。

您可以在此enter link description here中找到一个很好的示例,说明此错误发生的原因。