Java泛型 – 参数化类与类型化方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java泛型 – 参数化类与类型化方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3358字,纯文字阅读大概需要5分钟。
内容图文
![Java泛型 – 参数化类与类型化方法](/upload/InfoBanner/zyjiaocheng/795/824db9ae3bd6429fbbfbdc46319a9590.jpg)
我想这是一个重复的问题,但在浏览了大量相关问题之后,我找不到匹配的问题……是的,蹩脚的借口;)
我目前正在为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)?
解决方法:
据我所知,这里没有理由使用通用方法.用非泛型方法覆盖泛型方法可能不会按照您的想法进行.我已经讨论了这个here和here.(另见generic methods tutorial.)
通用方法的类型由呼叫站点决定.出于向后兼容性原因,允许将其覆盖为非泛型.一个人仍然可以出现并执行以下操作:
HSLFSlide slide = ...;
Slide<HSLFSlideShow> oops = slide;
// perfectly legal
// probably throws a ClassCastException somewhere
oops.<SomeOtherNotes>set(new SomeOtherNotes());
例如,通用方法允许我们定义一个返回它接受的相同类型的方法:
static <T> T pass(T t) { return t; }
String s = pass("abc");
Double d = pass(3.14d);
这是泛型方法有用的东西.
一个更典型的方法来做你想做的事情如下:
interface Slide<SS extends SlideShow> {
Notes<SS> getNotes();
void setNotes(Notes<SS> n);
}
class HSLFSlide implements Slide<HSLFSlideShow> {
Notes<HSLFSlideShow> notes = new HSLFNotes();
@Override
public Notes<HSLFSlideShow> getNotes() { return notes; }
@Override
public void setNotes(Notes<HSLFSlideShow> n) { notes = n; }
}
如果要求参考类型的注释不能作为界面,则应再次查看您的设计.例如,HSLFNotes实现可能具有应移至Notes界面的功能.
另一种方式如下:
interface Slide<N extends Notes<?>> {
N getNotes();
void setNotes(N n);
}
class HSLFSlide implements Slide<HSLFNotes> {
HSLFNotes notes = new HSLFNotes();
@Override
public HSLFNotes getNotes() { return notes; }
@Override
public void setNotes(HSLFNotes n) { notes = n; }
}
还有问题的工作实例:
interface Slide<SS extends SlideShow, N extends Notes<SS>> {…}
class HSLFSlide implements Slide<HSLFSlideShow, HSLFNotes> {…}
这其实很好.
内容总结
以上是互联网集市为您收集整理的Java泛型 – 参数化类与类型化方法全部内容,希望文章能够帮你解决Java泛型 – 参数化类与类型化方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。