//定义的人类:
package en.iteast.generic.domain;
import java.util.Comparator;
public class Person{
private int age;
private String name;
public Person() {
super();
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
@Override
public int hashCode() {
final int NUMBER = 36;
return this.name.hashCode() + age*NUMBER;
}
@Override
public boolean equals(Object obj) {
/**
* equals指定的类型本来就是Object,无法运用泛型对其进行指定
* (ComparatorByName implements Comparator<Person>)
* 该语句就可以指定类型为Person,从而其中compare的参数并不依赖于Object,
* 从而并不需要进行强制类型转换,也就使代码根据安全性,设计更简便。
*/
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
throw new ClassCastException();
}
Person person = (Person)obj;
return this.name.equals(person.name) && this.age == person.age;//该处equals方法是String类中的方法,因为name是String类型
}
}
//定义的学生类:
package en.iteast.generic.domain;
public class Student extends Person{
public Student() {
super();
}
public Student(int age,String name) {
super(age,name);
}
@Override
public String toString() {
return "Student [name="+getName()+",age"+getAge()+"]";
}
}
//定义的工人类:
package en.iteast.generic.domain;
public class Worker extends Person{
public Worker() {
super();
}
public Worker(int age, String name) {
super(age, name);
}
@Override
public String toString() {
return "worker [name="+getName()+",age"+getAge()+"]";
}
}
//测试类
package en.iteast.generic.demo;
import en.iteast.generic.domain.Student;
import en.iteast.generic.domain.Worker;
//需求:通过定义一个操作所有类型的类来探索泛型类的产生
public class GenericDemo4 {
public static void main(String[] args) {
Tool tool = new Tool();
//tool.setObject(new Student());//经过该方法,已将该对象提升为Object类型
tool.setObject(new Worker());
/**
* java.lang.ClassCastException
* 类型转换异常,Worker类不能转换为Student
* 早起程序员没有泛型时,经常出现该错误。
*/
Student student = (Student)tool.getObject();
//Type mismatch: cannot convert from Object to Student
//需要进行强制类型转换
System.out.println(student);
}
}
//创建一个用于操作student对象的工具类,对对象进行设置和获取。
//class Tool {
// private Student student;
//
// public Student getStudent() {
// return student;
// }
//
// public void setStudent(Student student) {
// this.student = student;
// }
//
//}
//创建一个用于操作所有对象的工具类,对对象进行设置和获取。
class Tool {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
报错:
Exception in thread "main" java.lang.ClassCastException: class en.iteast.generic.domain.Worker cannot be cast to class en.iteast.generic.domain.Student (en.iteast.generic.domain.Worker and en.iteast.generic.domain.Student are in unnamed module of loader 'app')
at en.iteast.generic.demo.GenericDemo4.main(GenericDemo4.java:16)
//利用泛型所改进的类:
package en.iteast.generic.demo;
import en.iteast.generic.domain.Student;
import en.iteast.generic.domain.Worker;
//需求:通过定义一个操作所有类型的类来探索泛型类的产生
public class GenericDemo4 {
public static void main(String[] args) {
Utile<Student> utile = new Utile<Student>();
utile.setObj(new Student());
//utile.setObj(new Worker());
/**
* The method setObj(Student) in the type Utile<Student>
* is not applicable for the arguments (Worker)
* 直接在编译时期就报异常,不像之前要等到运行时期才报异常,
* 将所报异常转到编译时期,更有利于程序员编程
*/
Student student = utile.getObj();
System.out.println(student);
}
}
//创建一个用于操作student对象的工具类,对对象进行设置和获取。
//class Tool {
// private Student student;
//
// public Student getStudent() {
// return student;
// }
//
// public void setStudent(Student student) {
// this.student = student;
// }
//
//}
//创建一个用于操作所有对象的工具类,对对象进行设置和获取--利用了泛型。
class Tool {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
//创建一个用于操作所有对象的工具类,对对象进行设置和获取。
class Utile<O>{
private O obj;
public O getObj() {
return obj;
}
public void setObj(O obj) {
this.obj = obj;
}
}
//输出结果:
Student [name=null,age0]