泛型:
在Jdk1.4版本之前,容器什么类型的对象都可以存储,但是在取出时,需要用到对象特有的内容时,需要做向下转型
但是对象的类型不一致,导致了向下转型发生了ClassCastException异常。
为了避免这个问题,只能主观上控制,往集合中存储的对象类型保持一致。
Jdk1.5以后解决了该问题,在定义集合时,就直接明确集合中元素的具体类型。
这样,编译器在编译时,就可以对集合中存储的对象类型进行检查。
一旦发现类型不匹配,就编译失败。这个技术就是泛型技术。
好处:
1.将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题。
2.避免了向下转型的麻烦。
总结:就是应用在编译时期的一项安全机制。
泛型的表型:
泛型技术在集合框架中应用的范围很大。
什么时候需要写泛型呢?
只要看到类,或者接口或者方法在描述的时候右边定义<>,就需要泛型。
其实是,容器在不明确操作元素的类型的情况下,对外提供的一个参数<>
使用容器时,只要将具体的类型实参传递给该参数即可。
说白了,泛型就是,传递类型参数。
public class GenericDemo3 {
public static void main(String[] args) {
Set<Person> set = new TreeSet<Person>(new ComparatorByQujianlei());
set = new HashSet<Person>();
set.add(new Person("abcd",27));
set.add(new Person("abcd",27));
set.add(new Person("xiaoming",23));
set.add(new Person("lisi",7));
set.add(new Person("wangwu",87));
for(Person p:set){
System.out.println(p);
}
}
}
//泛型接口
class Person implements Comparable<Person>{
String name;
int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {
int temp = o.age-this.age;
return temp==0?this.name.compareTo(o.name):temp;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {//这里的Object不能换为Person,因为这不是泛型方法
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
//泛型接口,比较器
class ComparatorByQujianlei implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
int temp = o1.getName().compareTo(o2.getName());
return temp==0?o1.getAge()-o2.getAge():temp;
}
}
泛型的擦除:
编译器通过泛型对元素类型进行检查,只要检查通过,就会生成class文件,但在class文件中,
就将泛型表示擦除了
关注我的微信公众号(曲健磊的个人随笔),观看更多精彩内容:


429

被折叠的 条评论
为什么被折叠?



