java - 如何指定方法 AnyObject<? super T,字符串>

标签 java generics jpa

我想在接口(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/

相关文章:

java - java EE 中的事务是什么?

java - Objectify 无法保存@Embedded 字符串列表

java - 如何在面板上使用 addActionListener

java - 在图上实现传输

java - 什么是原始类型,为什么我们不应该使用它呢?

spring - 相当于 spring-data-jpa 中的标准

java - 从 BlackBerry 连接到 VPN

c# - 表示 3 个值的集合的最佳方式

java - "?"的类型删除是什么?

java - JPA:没有 @OneToMany 注释的左连接