Java基础之:泛型
在不使用泛型的情况下,在ArrayList 中,添加3个Dog。
Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx())。
package class_Generic;import java.util.ArrayList;public class ClassTest01 { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { ArrayList dog = new ArrayList(); dog.add(new Dog("旺财",2)); dog.add(new Dog("来福",4)); dog.add(new Dog("小黑",6)); for (Object obj : dog) { Dog temp = (Dog)obj; System.out.println(temp); } //使用泛型改进 //"<>"尖括号内应写入期望在ArrayList中存放的元素的类型或父类。 ArrayList dogList = new ArrayList(); dogList.add(new Dog("旺财",2)); dogList.add(new Dog("来福",4)); dogList.add(new Dog("小黑",6)); for (Dog d : dogList) { //在使用dogList内元素时,编译类型可以直接使用Dog System.out.println(d); } }}class Dog{ private String name; private Integer age; public Dog(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } }
总结:可以看到在不适用泛型的情况下,每次取出ArrayList中的对象都需要使用Object类型。需要向下转型才可以获得原来的数据类型Dog,而使用泛型指定之后让ArrayList中取出的元素直接就是Dog类型,但同时在加入元素时也只加入Dog类型及其子类的实例对象。而若不适用泛型,那么加入到ArrayList中的元素类型不受约束(不安全)。
泛型介绍
泛型又称参数化类型,是jdk5.0出现的新特性,解决数据类型的安全性问题。
Java 泛型可以保证如果程序在编译时没有发出警告,那么在运行时就不会出现ClassCastException异常。
在类声明时通过一个标识来表示类中某个属性的类型或是某个方法的返回值及参数类型。
泛型实例化
在类名后面指定参数类型的值(类型)。
package com.atguigu.generic;import java.util.ArrayList;import java.util.HashMap;public class Generic02 { public static void main(String[] args) { //给public class ArrayList {} //解读 //给 E泛型 传入类型String //表我们可以给al放入的String, 或者是它的子类型 ArrayList al = new ArrayList(); al.add("tt"); al.add("hello"); //使用HashMap //public class HashMap {} //解读 //1. K 指定为 String //2. V 指定为 Customer //3. 当我们使用hm 时,编译器,就会约束 加入 的 k 是String , v 就是 Customer HashMap hm = new HashMap(); hm.put("hello1", new Customer()); hm.put("100", new Person());//多态 HashMap hm2 = new HashMap(); hm2.put("200", new Tiger()); }}interface IMy { }class Tiger implements IMy { }class Customer { }class Person extends Customer { }
泛型使用
创建 3个学生对象。放入到 HashMap中,要求 Key 是 String, name, 使用泛型, Value 就是 学生对象。使用两种方式遍历
package class_Generic;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class ClassWork01 { public static void main(String[] args) { HashMap hashMap = new HashMap<>(); Student student1 = new Student("小范"); Student student2 = new Student("小黄"); Student student3 = new Student("小雨"); hashMap.put(student1.getName(),student1); hashMap.put(student2.getName(),student2); hashMap.put(student3.getName(),student3); Set keySet = hashMap.keySet(); for (String string : keySet) { System.out.println("key:" + string + ",value:" + hashMap.get(string)); } System.out.println("==========================="); Set> entrySet = hashMap.entrySet(); Iterator> iterator = entrySet.iterator(); while(iterator.hasNext()) { Map.Entry node = iterator.next(); System.out.println("key:" + node.getKey() + ",value:" + node.getValue()); } }}class Student{ private String name; public Student(String name) { this.name = name; } @Override public String toString() { return "Student [name=" + name + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
泛型练习题
定义Employee类
1) 该类包含:private成员变量name,age,birthday,其中 birthday 为 MyDate 类的对象;
2) 为每一个属性定义 getter, setter 方法;
3) 重写 toString 方法输出 name, age, birthday
4) MyDate类包含: private成员变量month,day,y.........