一个 Java 泛型套泛型的问题

2019-05-05 17:26:13 +08:00
 mk0114

有如下 mapper:

public interface PeopleMapper extends BaseMapper<People> {}

现在我只能写成这样:

List<SelectAllMapper> mappers = Util.getMappers(SelectAllMapper.class, People.class);

这个工具函数意思是:找到全部的以 People 为实体类,并实现了 SelectAllMapper 接口的 mapper:

public static <T> List<T> getMappers(Class<T> mapperClass, Class<?> entityClass){...}

但我想做到这样:

List<SelectAllMapper<? extends People>> mappers = Util.getMappers(SelectAllMapper.class, People.class);

这样就不需要我之后再强制转换类型:

(List<People>) mapper.selectAll()

但不知道该怎么声明这个函数,有木有大佬教教我

2495 次点击
所在节点    Java
7 条回复
mk0114
2019-05-05 17:28:49 +08:00
`public static <T,R> List<T<R>> getMappers(Class<T> mapperClass, Class<R> entityClass) {...}`

这样明显是不对的
mk0114
2019-05-05 17:32:48 +08:00
public static <T<R>,R> List<T> getMappers(Class<T> mapperClass, Class<R> entityClass) {...}
这样也是不行
xingda920813
2019-05-05 18:19:26 +08:00
public static <T extends BaseMapper<R>, R> List<T> getMappers(Class<T> mapperClass) {...}

List<? extends BaseMapper<People>> mappers = getMappers(new BaseMapper<People>() {}.getClass());
mk0114
2019-05-05 18:31:29 +08:00
@xingda920813 BaseMapper 是 SelectAllMapper 的子接口,这样写应该是不行的。我怀疑是不是 java 不可能做到这样
HuHui
2019-05-05 19:16:24 +08:00
用我的理解写了你的需求,感觉没你的复杂
```
public class People {
}


public interface SelectAllMapper<T> extends BaseMapper<T> {
List<T> selectAll();
}

public interface PeopleMapper extends BaseMapper<People> {
}

public static <T> List<SelectAllMapper<T>> getMappers(Class<T> clazz) {
return null;
}

List<SelectAllMapper<People>> mappers = Util.getMappers(People.class);
List<People> list = mappers.get(0).selectAll();
```
billlee
2019-05-05 22:09:51 +08:00
换 scala (逃
mk0114
2019-05-06 08:47:40 +08:00
@HuHui 是 BaseMapper 继承了 SelectAllMapper,我放弃了,写个 suppressWarnings 得了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/561192

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX