这一章节我们来讨论一下泛型接口的使用。
我们以生成器为例子(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
总结:这一章节主要展示了泛型接口的使用。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
从头写React-like框架的工程搭建实现 最近在网上看到了 Build your own React 这篇文章,作者从零开始实现了一个简易类 React 框架,虽然没有过多的优化,但 React 中的核心思想 Concurrent Mode,Fiber ...
Java-3D游戏引擎与基本游戏Java中使用LWJGL,OpenGL,OpenAL等的3D游戏引擎。 从头开始
本资料是UCSF DOCK的使用案例分享的输入资料,将使用DOCK 6.11自带的片段库,使用DOCK/RDKit的 DOCK_D3N功能从头设计分子。便于使用者直接从这部分设计工作开始,不需花时间来准备输入文件。
从头开始学习Java课程-资料来源PillsInformática。
视频 https://www.bilibili.com/video/BV1914y1s7hi
视频 https://www.bilibili.com/video/BV1914y1s7hi
外卖订餐java源码 你会学到什么 通过 Java 片段的构建块,您将能够立即了解 Java 编程的要点。 你需要什么 勇敢地浏览存储库! 或替代开源 JDK 1.8 版本 截至今天,该存储库已通过测试 Oracle JDK 1.8 OpenJDK 1.8 ...
从头学Android之多媒体--使用MediaPlayer播放音频示例代码
赖世雄英语从头学 下载-附件资源
军工行业2021年度投资策略:而今迈步从头越-20201115-招商证券.pdf
java实现验证码功能源码 Java Periphery 是一个高性能库,用于用户空间 Linux 中的 GPIO、LED、PWM、SPI、I2C、MMIO 和串行外设 I/O 接口访问。 我没有尝试从头开始构建它并生成 JNI 包装器。 这节省了大量手动编码...
乙二醇2020年度策略报告:“熊”关漫道真如铁,而今迈步从头越-20191230-光大期货-36页.rar
开发人员零java-Mentorama 在此存储库中,将从头开始插入Java Developer模块的Mentorama课程期间开发的所有练习。
如果您了解一点C或JavaScript,本指南就是从头开始学习Java。 这是一个正在进行的工作,应该在下一个Java LTS(Java 17)发布时准备就绪。 所有代码都在启用预览功能的Java 14上运行。 注意:如果您只希望查看...
我完全是从头开始制作此程序的,没有从其他来源复制任何功能。 我知道代码不是很完美,但是在我还承担其他学术职责的同时,我还是赶时间按时提交。 运行服务器JAR的用户被视为服务器。 与服务器位于同一个WiFi网络...
java源码字符串缓冲区 这是 Java String 、 StringBuilder和StringBuffer方法/API 的完整指南。 本指南的源代码示例在我们的本地开发环境中进行了良好的测试,您可以将这些示例用作无错误。 您可以在 上了解更多信息...
此仓库给出了在框架开发中经常使用的不同Java概念和编程技术的示例。 例如,当我们想从头开始创建RPC框架时,我们需要了解Java动态代理和序列化。 这是清单: 技术 模块/链接 设想 地位 评论 动态代理 动态代理 ...
3D游戏从头编-网上收集,很基础. 第一回:开发环境 第二回:3D基本概念 第三回:第一个D3D程序 第四回:渲染顶点 第五回:渲染索引顶点 第六回:摄象机 第七回:灯光 第八回:纹理 第九回:3D模型(.x)
编译器(从头开始) 从 MiniJava() 到用(简单)C++ 编写的编译器。 据我所知,这是最快的 Minijava(到 LLVM IR)编译器。 描述 目前,编译器处于早期开发阶段。 在撰写本文时,词法分析、解析和类型检查以及代码...
Java系列13-Spring Boot 实际上,我们将从头开始逐步开发项目。 我们将详细检查Spring Boot开发环境和体系结构。 借助Spring Boot,我们将探索公司Java项目的基础架构。 您可以通过Spring Framework为自己带来美好的...