我想在接口中指定一个方法,一个实现方法的签名(基于JPA 2)是:
List<T> getByStringValue(SingularAttribute<? super T, String> attribute, String value)
我想在一个从jpa中抽象出来的接口(Object<? super T, String>
是不可能的)中指定这个方法。实现方法可能有不同的签名,但我希望它接受SingularAttribute<? super T, String>
,我想在类型安全查询中使用它而不需要转换。
最后,我想在“存储库”界面中指定所有实体交互,并希望提供一个基于JPA的实现,涵盖所有实体的大部分实现(以最小化冗余代码)。我已经为CRUD-ops和getAll完成了它。现在我希望我能为getByCriteria提供一个通用的方法(目前一个Critera已经足够了)。
答案 0 :(得分:1)
Java不允许非泛型参数部分本身是某种通配符,例如任何具有某些通用参数的类:
<T> void method(*<T, String> o) // can't do this
但是你可以定义一个抽象类型并拥有你想要使用的所有类,就像这样实现它,如:
interface StringGetter<T> {
T getByStringValue(String value);
}
然后:
public class WidgetStringGetter implements StringGetter<Widget> {
public Widget getByStringValue(String value) {
// whatever
}
}
和
public static <T> T factory(StringGetter<T> getter, String value) {
return getter.getByStringValue(value);
}
最后:
Widget w = factory(new WidgetStringGetter(), "foo");
答案 1 :(得分:0)
请尝试以下操作。
<R, T extends R> List<T> getByStringValue(SingularAttribute<R, String> attribute, String value)
<R, T extends R>
定义用于方法签名的通用参数。