服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java初学者实践教程11-泛型声明

      上节课我们留下了一个泛型声明的概念,这个概念乍一听起来是很陌生的,不过不要紧,听我细细道来。泛型声明就是泛泛的声明类型。我们用其它的语言做一个比较:

   javascript声明变量: var i= 1;var c = ‘char ’

   vb 声明变量:      dim i=1;dim c=’char’

   perl 声明变量:      $i = 1; $c = ‘char’

     这些脚本语言,在声明变量的时候,根本就不想java那样还得声明类型。他们的类型已经自己声明完了,是泛泛的声明的,这些语言本身就是泛型。因为数据类型可能会改变,所以用不着像java定的那么死。但是数据类型可不是说变就变的,java的强类型机制,保证了逻辑的严谨性,而且确保着程序员犯错误,这是java的优点。同时使得它开发起来没有上述语言那样简单,一点小事上做起来都很笨拙。这是其中一个方面,另一个方面如我们上节讲的java的集合类里面的类型是不确定的,放什么都行啊。这样的话你明明自己放进去的类型,也就是说你自己已经知道类型了,拿出来的时候,还得不断的转换。我们在介绍拆箱与装箱机制的时候已经说过这个类型的问题了。拆箱与装箱确实能解决不少问题但那是不够的。

    所以接着上节课学集合类的劲头,趁热打铁。我们讲一下刚才说的第二个方面,关于集合类的问题。我们刚才说,java这种类型安全之下的破绽,我们要用泛型的方式来弥补。我们来实践一个例子。

实践:

import java.io.ioexception;

import java.io.printstream;

import java.util.hashmap;

import java.util.iterator;

import java.util.linkedlist;

import java.util.list;

import java.util.map;

public class genericstester {

  public void testtypesafemaps(printstream out) throws ioexception {

    map<integer, integer> squares = new hashmap<integer, integer>();

 

    for (int i=0; i<100; i++) {

      squares.put(i, i*i);

    }

    for (int i=0; i<10; i++) {

      int n = i*3;

      out.println(n + "的平方是" + squares.get(n));

    }

  }

//测试安全的链表

  public void testtypesafelists(printstream out) throws ioexception {

    list listofstrings = getlistofstrings();

    for (iterator i = listofstrings.iterator(); i.hasnext(); ) {

      string item = (string)i.next();

    }

    list<string> onlystrings = new linkedlist<string>();

    onlystrings.add("legal addition");

    /**

     * uncomment these two lines for an error

    onlystrings.add(new stringbuilder("illegal addition"));

    onlystrings.add(25);

     */

  }

  public void testtypesafeiterators(printstream out) throws ioexception {   //初始化迭代

    list<string> listofstrings = new linkedlist<string>();

    listofstrings.add("happy");

    listofstrings.add("birthday");

    listofstrings.add("to");

    listofstrings.add("you");

 

    for (iterator<string> i = listofstrings.iterator(); i.hasnext();) {

      string s = i.next();

      out.println(s);

    }

    printlistofstrings(getlistofstrings(), out);

  }

//得到普通链表

  private list getlist() {

    list list = new linkedlist();

    list.add(3);

    list.add("blind");

    list.add("mice");

    return list;

  } 

  //得到安全的链表

  private list<string> getlistofstrings() {

    list<string> list = new linkedlist<string>();

    list.add("hello");

    list.add("world");

    list.add("how");

    list.add("are");

    list.add("you?");

    return list;

  }

  public void testtypesafereturnvalues(printstream out) throws ioexception {

    list<string> strings = getlistofstrings();

    for (string s : strings) {

      out.println(s);

    }

  } //接受参数化类型的链表

  private void printlistofstrings(list<string> list, printstream out)

    throws ioexception {

    for (iterator<string> i = list.iterator(); i.hasnext(); ) {

      out.println(i.next());

    }

  }

  public void printlist(list<?> list, printstream out) throws ioexception {    for (iterator<?> i = list.iterator(); i.hasnext(); ) {

      out.println(i.next().tostring());

    }

  }

  public static void main(string[] args) {

    genericstester tester = new genericstester();

    try {

      tester.testtypesafelists(system.out);

      tester.testtypesafemaps(system.out);

      tester.testtypesafeiterators(system.out);

      tester.testtypesafereturnvalues(system.out);

 

      list<integer> ints = new linkedlist<integer>();

      ints.add(1);

      ints.add(2);

      ints.add(3);

      tester.printlist(ints, system.out);

    } catch (exception e) {

      e.printstacktrace();

    }

  }

 此例子打包下载

在list和map类的后面有个<>的参数,这个参数表示集合类里面的元素类型。list<string>就是表示,list里面的元素都是string类型的。这样我们就可以在事先确定list的类型了,省着大家一起做项目的时候。只知道list里面有什么还得问写的那个人,你同事写完了还得给你讲那里面是什么。这回你看着方法名就全知道了。关于泛型的概念还有很多我们不能一下子讲完,以后的教程我们会详细讲解。

扫描关注微信公众号