这一章节我们来讨论一下泛型接口的使用。
我们以生成器为例子(generator),生成器是工厂方法的一种运用,主要用来创建对象,一般使用工厂方法都是需要输入参数以便取得不同的对象,但是生成器是生成一系列的对象。
代码:
package com.ray.ch13;
import java.util.Iterator;
import java.util.Random;
public class Test implements Generator<Father> {
private Class<?>[] classes = { Sub1.class, Sub2.class, Sub3.class };
private Random random = new Random();
@Override
public Father next() {
Father father = null;
try {
father = (Father) classes[random.nextInt(3)].newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return father;
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i < 5; i++) {
System.out.println(test.next());
}
}
}
interface Generator<T> {
T next();
}
class Father {
private static int counter = 0;
private final int id = counter++;
@Override
public String toString() {
return "name:" + getClass().getSimpleName() + " id:" + id;
}
}
class Sub1 extends Father {
}
class Sub2 extends Father {
}
class Sub3 extends Father {
}
输出:
name:Sub3 id:0
name:Sub1 id:1
name:Sub3 id:2
name:Sub3 id:3
name:Sub3 id:4
上面的代码通过生成器生成了5个Father 的自对象Sub,在创建的过程中,生成器不需要输入参数,直接是生成一些列Father的子类对象。
我们修改一下上面的代码,使它满足foreach的使用(就是实现Iterable接口):
package com.ray.ch13;
import java.util.Iterator;
import java.util.Random;
public class Test implements Generator<Father>, Iterable<Father> {
public Test() {
}
private int size = 0;
public Test(int size) {
this.size = size;
}
private Class<?>[] classes = { Sub1.class, Sub2.class, Sub3.class };
private Random random = new Random();
@Override
public Father next() {
Father father = null;
try {
father = (Father) classes[random.nextInt(3)].newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return father;
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i < 5; i++) {
System.out.println(test.next());
}
System.out.println("------------------");
for (Father father : new Test(5)) {
System.out.println(father);
}
}
@Override
public Iterator<Father> iterator() {
return new FatherIterator();
}
class FatherIterator implements Iterator<Father> {
private int count = size;
@Override
public boolean hasNext() {
return count > 0;
}
@Override
public Father next() {
count--;
return Test.this.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
interface Generator<T> {
T next();
}
class Father {
private static int counter = 0;
private final int id = counter++;
@Override
public String toString() {
return "name:" + getClass().getSimpleName() + " id:" + id;
}
}
class Sub1 extends Father {
}
class Sub2 extends Father {
}
class Sub3 extends Father {
}
输出:
name:Sub3 id:0
name:Sub1 id:1
name:Sub3 id:2
name:Sub3 id:3
name:Sub3 id:4
------------------
name:Sub3 id:5
name:Sub1 id:6
name:Sub1 id:7
name:Sub2 id:8
name:Sub3 id:9
参数化的接口确保next()的返回类型。
我们下面再看另一个例子,是著名的数学题目斐波那契数列:
package com.ray.ch13;
public class Test implements Generator<Integer> {
private Integer count = 0;
@Override
public Integer next() {
return fib(count++);
}
private Integer fib(int param) {
if (param < 2) {
return 1;
}
return fib(param - 2) + fib(param - 1);
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i < 10; i++) {
System.out.print(test.next() + " ");
}
}
}
interface Generator<T> {
T next();
}
输出:
1 1 2 3 5 8 13 21 34 55
总结:这一章节主要展示了泛型接口的使用。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
在Java开发中,这样的库可以极大地提高开发效率,因为它封装了常见的功能,开发者可以直接使用,而无需从头编写代码。 描述中的 "mchange-commons-java-0.2.11.jar包" 是该库的主要组成部分,是一个Java归档(JAR)...
Eclipse IDE for Java Developers 是一款广泛使用的集成开发环境(IDE),专为Java编程设计。它由Eclipse基金会维护,提供了一整套工具,用于编写、调试、测试和部署Java应用程序。2021-12-R 版本是Eclipse的一个...
标题中的“api-ntrip-java-client-master.zip”是一个包含Java实现的NTRIP客户端的源代码压缩包,专门针对Android平台。NTRIP(Networked Transport of RTCM via Internet Protocol)是一种用于实时传输GPS(全球...
标签 "aip sdk" 进一步确认了这是一个与百度AIP相关的SDK,通常这样的SDK会提供一系列预先封装好的接口,使得开发者可以快速地在自己的项目中集成AI功能,而无需从头开始编写复杂的算法和模型。 在压缩包的文件名称...
在Java中,集合框架主要包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。这个框架允许我们高效地处理各种数据结构,而无需从头开始编写代码。泛型则是Java 5引入的一项...
【标题】"Aspose.Words for Java 23.6 with JDK 17 Support" Aspose.Words 是一个强大的文档处理库,专为Java开发者设计,用于创建、操作和转换各种文档格式。版本23.6是这个库的一个重要更新,它引入了对Java ...
1. **Java编程语言**:微服务通常使用Java作为主要开发语言,因为Java具有跨平台性、稳定性和强大的库支持。 2. **Spring Boot**:许多微服务框架如Spring Boot依赖于Java,Spring Boot简化了创建独立的、生产级别的...
Java Swing是Java GUI(图形用户界面)开发的一个重要组件,它是Java Foundation Classes (JFC)的一部分,用于构建桌面应用程序。Swing提供了丰富的组件库,允许开发者创建美观且功能丰富的交互式用户界面。在这个...
这部分内容主要聚焦于第11章的“Java集合框架和泛型机制”,特别关注List接口及其几种实现类,包括`ArrayList`、`LinkedList`、`Vector`以及`Stack`。 ### 11-4 List接口实现类 #### 11.4.1 实现类ArrayList - **...
在Java编程中,多文件...通过这个"java-多文件上传dome"工具包,你可以快速实现上述功能,无需从头编写所有代码。不过,记得在实际项目中,除了功能实现,还要关注性能、安全性和可维护性,确保应用程序的稳定运行。
使用这个库,开发者可以避免从头实现模糊算法,而是直接调用库中的函数,减少工作量,提高效率。在实际应用中,这种模糊视图背景常用于对话框、弹出窗口或者浮动视图,以提供更好的视觉层次感和用户体验。 总结来说...
Java SDK是许多软件开发中的重要组成部分,特别是在与服务器端交互时...通过学习和使用这个SDK,开发者可以迅速在自己的应用中实现稳定、可靠的即时通信功能,而无需从头构建整个通讯系统,大大节省了开发时间和资源。
Java是一种广泛使用的面向对象的编程语言,其特点包括抽象、继承、封装和多态性。在Java笔试中,这些概念经常被考察。 1. **面向对象的特征**: - **抽象**:抽象是将复杂问题简化的过程,分为过程抽象(方法)和...
在Java编程中,库(Library)是预先编写好的代码集合,程序员可以导入并直接使用,无需从头开始编写所有功能。这些库通常以JAR(Java Archive)文件的形式存在,里面封装了类和方法,可供应用程序调用。Java库广泛...
`Free Spire.Doc for Java` 提供了无水印的商业版本,意味着开发者可以在商业项目中放心使用。不过,为了遵循许可协议,应仔细阅读`license.rtf`文件,了解使用限制和条件,比如可能存在的分发限制、商标使用规定等...
这意味着它可能使用了 Java 核心库中的接口和类,并且遵循了 Java 的编程规范。对于 Java 开发者来说,这样的库是提高生产力的重要资源。 根据压缩包的文件名 "ks-java-lib-master" 可以推测,这可能是一个 Git ...
【标题】:“curso-java-pildorasInf:从头开始学习Java” 这门“从头开始学习Java”的课程,源自"PillsInformática"的教育资源,旨在为初学者提供全面的Java编程知识。Java是一种广泛使用的面向对象的编程语言,由...
Java平台提供了一系列库来支持这些操作,本项目中涉及的主要有Spire.Doc、Spire.PDF以及Apache PDFBox。让我们详细探讨这些库的功能及其在Java开发中的应用。 首先,`Spire.Doc.jar`是Spire.Doc for Java的库文件,...