【发布时间】:2015-04-04 09:06:56
【问题描述】:
我猜这是一个重复的问题,但是在浏览了大量相关问题后,我找不到匹配的问题......是的,蹩脚的借口;)
我目前正在为POIs 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)?
【问题讨论】:
-
我相信你不能,至少只要你希望它是类型安全的。 Java 中的类型系统相当冗长,遗憾的是不如其他一些语言中的类型系统灵活。这是因为 Java 泛型是后来添加的,并且提供向后兼容性对语言设计者很重要。
标签: java generics inheritance apache-poi parameterized-types