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);
成员类型可以是任何类型,因此它是对象类型。 怎么解决?感谢。
答案 0 :(得分:1)
您可以声明一个(未经检查的)泛型类型来链接转换,也许在内部私有方法中,以避免其他调用者可见。这甚至可以编译:
CriteriaBuilder cb;
Object a;
Object b;
@SuppressWarnings("unchecked")
private <E> void isMember() {
cb.isMember((Expression<E>) a, (Expression<? extends Collection<E>>) b);
}
虽然a
和b
可以更好地作为类型Expression
,和/或作为更局部范围的方法中的局部变量或参数。
答案 1 :(得分:0)
编译器的问题是(Expression<Object>)a
也可能是E
的实际类型Object
。为了使方法运行,你必须避免演员。
您可以在此enter link description here中找到一个很好的示例,说明此错误发生的原因。