import java.util.Iterator;
import java.util.Random;

public class Test {
    public static void main(String[] args) {
//        ATester.test();
        Tester.test();
    }
}

interface Generator<T>{
    T next();
}

class A { }
class a extends A{ }
class b extends A{ }
class c extends A{ }
class d extends A{ }

/*
    思路:
        Generator这个生成器,你可以给它指定size,当你通过迭代器
        调用它的生成方法时,你就只能生成你指定的size个元素。
 */
class ATester implements Generator<A>,Iterable<A> {

    private Class[] types = {a.class,b.class,c.class,d.class};
    private int size;
    );

    public ATester() {
    }

    public ATester(int size) {
        this.size = size;
    }

    @Override
    public A next() {
        try{
            return (A)types[rand.nextInt(types.length)].newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Iterator<A> iterator() {
        return new Iterator<A>() {
            int count = size;
            @Override
            public boolean hasNext() {
                ;
            }

            @Override
            public A next() {
                count--;
                return ATester.this.next();
            }
        };
    }

    static void test() {
        ATester g = new ATester();
        ; i < ; i++) {
            System.out.println(g.next());
        }
    }
}

/*
    负责生成斐波那契数列的生成器!
 */
class Fibonacci implements Generator<Integer> {
    ,ppre=;
    ;
    @Override
    public Integer next() {
        int result;

        i++;
         ) {
            result=;
        }else{
            result=pre+ppre;
        }

        ppre = pre;
        pre = result;

        return result;
    }
}
//这个方案计算量太多了
class Fibonacci2 implements Generator<Integer> {
    ;
    private int fbi(int i) {
        ) {
            ;
        }
        )+fbi(i-);
    }
    @Override
    public Integer next() {
        return fbi(++count);
    }
}

//编写一个适配器
class FibonacciAdaptor implements Iterable<Integer> {
    private int size;
    private Fibonacci fibonacci;

    public FibonacciAdaptor(int size, Fibonacci fibonacci) {
        this.size = size;
        this.fibonacci = fibonacci;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            //我的方案,感觉没有书中的优雅
            //int i = 0;
            @Override
            public boolean hasNext() {
                //return i<size;
                ;
            }

            @Override
            public Integer next() {
                //i++;
                size--;
                return fibonacci.next();
            }
        };
    }
}
class Tester{
    static void test() {
        Fibonacci f = new Fibonacci();
        ;
        ) {
            System.out.print(f.next()+" ");
            i++;
        }
        System.out.println();

        Fibonacci2 f2 = new Fibonacci2();
        i = ;
        ) {
            System.out.print(f2.next()+" ");
            i++;
        }

    }
}

Java编程思想:泛型接口的更多相关文章

  1. Java编程思想(11~17)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...

  2. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  3. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  4. JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)

    switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) ...

  5. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...

  6. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  7. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  8. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  9. 《java编程思想》读书笔记(一)开篇&第五章(1)

    2017 ---新篇章  今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...

  10. Java编程思想——初始化与清理

    PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化   虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...

随机推荐

  1. C#基础加强篇---委托、Lamada表达式和事件(中)

    2.Lamada表达式     C#共有两种匿名函数:匿名方法和Lamada表达式.在2.0之前的C#版本中,创建委托的唯一方法是使用命名方法.C#2.0中引入了匿名方法,匿名方法就是没有名称的方法. ...

  2. The specified type member 'IsLock' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

    var query = from C in objDb.GetDb<A>() join a in objDb.GetDb<B>().Where(m => m.Comput ...

  3. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  4. C#二分查找法 破洞百出版本

    二分查找法在数据繁多的数据中查找是一种快速的方法,每次查找最多需要的次数 为2的n次方小于总个数. 当然是有前提的,就是需要把数据先排好序,这里指的都是数值型的数据. 基本思想就是把需要找的值与排序好 ...

  5. Qt实现长文件名(字符串)在QLabel中自适应缩短

    一.应用场景简述 当在有限宽度的QLable中显示很长的文件名/字符串时,超出QLabel宽度部分将不会显示,此时采取缩短文件名策略(也可实现为字符串滚动动画)可以缓解这一问题.在实现这一想法的过程中 ...

  6. Md2All:好用的markdown文件转换工具,文章迁移微信公众号的利器

    目录 简介 使用体验 极速上手 更多功能 总结 简介 markdown以简单的语法和强大的功能,征服了无数技术创作者,几乎主流的技术博客网站都开始支持markdown语言撰写博客.但是微信公众号的文章 ...

  7. vue复选框获取值的补充

    要通过vue的v-model获取选中复选框的值,可以用遍历对象的方式获取,代码如下: <!DOCTYPE html> <html xmlns="http://www.w3. ...

  8. 高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql

    Mysql客户端 lua-resty-mysql是为基于cosocket API的ngx_lua提供的Lua Mysql客户端,通过它可以完成Mysql的操作.默认安装OpenResty时已经自带了该 ...

  9. ElasticSearch学习(一):ElasticSearch介绍

    一.ElasticSearch是什么? ElasticSearch是一款非常强大的.基于Lucene的开源搜索及分析引擎,可以帮助你从海量数据中,快速找到相关的数据信息. 比如,当你在GitHub上搜 ...

  10. wince kill 进程

    http://www.cnblogs.com/fujinliang/archive/2012/09/13/2684165.html 原文地址 http://www.2cto.com/kf/201504 ...