从头认识java-13.3 泛型接口的使用

这一章节我们来讨论一下泛型接口的使用。

我们以生成器为例子(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

总结:这一章节主要展示了泛型接口的使用。

这一章节就到这里,谢谢。

-----------------------------------

目录

时间: 2024-11-29 07:06:00

从头认识java-13.3 泛型接口的使用的相关文章

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

2019年9月17 发布 Java 13

2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 目前,JDK官网上已经可以看到JDK 13的进展,最新版的JDK 13将于2019年9月17日发布. 目前,JDK13处于Release-Candidate Phase(发布候选阶段),将于9月17日正式发布.目前该版本包含的特性已经全部固定,主要包含以下五个: JEP 350,Dynamic CDS Archives JEP 351,ZGC: Uncommit

Java 9 ← 2017,2019 Java → 13 ,都发生了什么?

距离 2019 年结束,只剩下 35 天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天, 的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋友圈,人们纷纷晒出自己2017和2019的照片对比. 作为一个技术宅,我也做了一个对比: 2017 年 9 月 21 日,Java 9 正式发布,并且在2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 历任JDK对比 J

Java(13) 抽象和封装

一.简述从现实世界中抽象出类的步骤 第一:找出分类(分析出类) 第二:找出类的特征(分析类的相关属性) 第三:找出类的行为(分析类的方法) 二.常量(经常出现的变量值) 2.1 语法: public static final 数据类型 常量名 = 常量值;注意:1.final最终的,修饰的变量不能被修改 2.变量名的所有字母都大写,多个单词用下划线(_)分割, 例如:public static final String SEX_MALE ="Q仔"; 常量的访问式:类名.常量名 示例:

java 13个核心技术

前端时间由于软考的原因,已经开始了j2se的学习,马士兵老师带我们走进了java的世界.最近在学习j2ee的过程中,了解到java的13个核心技术,于是先来个宏观的了解吧. 其实java的大方向就是j2ee,J2EE平台由一整套服务(Services).应用程序接口(API)和协议构成.它对开发基于web的多层应用提供了功能支持,下面对J2EE中的13中技术规范进行简单的描述.这里面想说明的是13中规范在现在只是一种宏观把控,后期的视频会一一攻破,这里就先不找他们的共同点了.每次总结点多余5个的

java 13.静态类成员

静态类成员 静态类成员方法和变量都可以据有静态属性,声明静态成员使用static修饰符. 类设计中的一个关键循环,就是决定是否将一个方法或变量声明为静态的. 静态变量 在程序中任何变量或者代码都是在编译时,由系统自动分配内存来存储的,而所谓静态就是指在编译后分配的内存会一直存在,直到程序推出时才会释放内存空间. 在java程序里,所有东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员(成员指类中的函数.变量) 静态方法 静态方法是使用公共内存空间的,就是说所有对象都可以直接引用

Java 13位时间戳转换日期格式

1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 5 public class DateUtil { 6 7 private static SimpleDateFormat sf = null; 8 9 /** 10 * 获取系统时间 11 */ 12 public static String getCurrentDate() { 13 Date d

从头学Java【3】——之命名方法

1.命名法 对于变量.数组.方法/函数.类和对象,如何规范地进行命名至关重要,尤其是当程序规模扩大,变量数量激增的情况下.比较著名的命名规则: (1)匈牙利命名法 这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的,C语言中常用此种命名法.标识符的名字以一个或者多个小写字母开头作为前缀:前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途.例如:lpszStr, 表示指向一个以'\0'结尾的字符串(sz)的长指针(lp)变量. (2

JAVA 13 (集合框架)

集合是一种容器. 集合和数组的不同之处:只用于存储对象,集合长度可变,数组只能存同一种类型的对象,集合可以存任意对象. Collection |--List:元素是有序的,元素可以重复,因为该集合提醒有索引 |--ArrayList:底层的数据结构使用的是数组,查询速度很快,增删稍慢.是不同步的,容易出安全隐患.单线程用,效率高. |--LinkedList:底层数据结构使用的是链表数据结构,查询速度慢,增删快 |--Vetor:底层是数组数据结构.victor是同步的,进步不用了 |--Set

Java 13 - Java 数组

Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100]来代替直接声明100个独立变量number0,number1,....,number99. 本教程将为大家介绍Java数组的声明.创建和初始化,并给出其对应的代码. 声明数组变量 首先必须声明数组变量,才能在程序中使用数组.下面是声明数组变量的语法: dataType[] arra