我想这是一个重复的问题,但是在浏览了大量相关问题之后,我找不到匹配的问题……是的,蹩脚的借口;)
我目前正在为POI HSLF/XSLF实现开发一个通用接口。使用泛型的原因是为了支持Iterable接口,用户代码不需要向下转换到具体的实现,即可以决定是使用实现类还是通用接口。当然,如果没有泛型,返回类型缩小按预期工作。
我的目标是最小化类用户的参数声明 - 请参阅 main 方法。在内部,通用引用可能更复杂。
所以我想要这样的东西:(为了简单起见,我没有使用 Iterable 接口,而是使用了不同的类型参数)
/* 更新:向类添加静态并删除空定义以实际运行示例 */
public class GenericsTest {
static interface SlideShow {}
static class HSLFSlideShow implements SlideShow {}
static interface Notes<SS extends SlideShow> {}
static class HSLFNotes implements Notes<HSLFSlideShow> {}
static interface Slide<SS extends SlideShow> {
<N extends Notes<SS>> N getNotes();
<N extends Notes<SS>> void setNotes(N n);
}
// compile errors
static class HSLFSlide implements Slide<HSLFSlideShow> {
HSLFNotes notes = new HSLFNotes();
@Override
public HSLFNotes getNotes() { return notes; }
@Override
public void setNotes(HSLFNotes n) { notes = n; }
}
public static void main(String[] args) {
HSLFSlide s = new HSLFSlide();
HSLFNotes n = s.getNotes();
s.setNotes(n);
Slide<HSLFSlideShow> s2 = new HSLFSlide();
Notes<HSLFSlideShow> n2 = s2.getNotes();
}
}
我可以让它工作......但这似乎有点笨拙:
static interface Slide<SS extends SlideShow, N extends Notes<SS>> {
N getNotes();
void setNotes(N n);
}
static class HSLFSlide implements Slide<HSLFSlideShow,HSLFNotes> {
HSLFNotes notes = new HSLFNotes();
@Override
public HSLFNotes getNotes() { return notes; }
@Override
public void setNotes(HSLFNotes n) { notes = n; }
}
public static void main(String[] args) {
HSLFSlide s = new HSLFSlide();
HSLFNotes n = s.getNotes();
s.setNotes(n);
Slide<HSLFSlideShow,HSLFNotes> s2 = new HSLFSlide();
Notes<HSLFSlideShow> n2 = s2.getNotes();
}
您将如何最小化 main 方法中所需的类型参数(最低为 JDK6)?