我想在接口(interface)中指定一个方法,实现方法的签名(基于 JPA 2)是:
List<T> getByStringValue(SingularAttribute<? super T, String> attribute, String value)
我想在从 jpa 抽象的接口(interface)中指定此方法(Object<? super T, String>
是不可能的)。实现方法可能有不同的签名,但我希望它接受 SingularAttribute<? super T, String>
我想在类型安全查询中使用它而不需要进行转换。
最后,我想在“存储库”接口(interface)中指定所有实体交互,并希望提供一个基于 JPA 的实现来覆盖所有实体的大部分内容(以最大限度地减少冗余代码)。我已经完成了 CRUD-ops 和 getAll 的工作。现在我希望我能为 getByCriteria 提供一种通用方法(目前一个 Critera 就足够了)。
最佳答案
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");
关于java - 如何指定方法 AnyObject<? super T,字符串>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30297197/