如何指定方法AnyObject <! - ? super T,String - >

时间:2015-05-18 07:19:58

标签: java generics jpa

我想在接口中指定一个方法,一个实现方法的签名(基于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已经足够了)。

2 个答案:

答案 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>定义用于方法签名的通用参数。