传智播客-----泛型方法

泛型方法
package com.zhou.generic;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class TestGeneric {
public static void main(String[] args) {
/**
* 泛型方法测试:
*
*/
String[] objs2 = new String[]{"AA","BB","CC"};
Collection<String> coll2 = new ArrayList<>();
fromArrayToColllection(objs2, coll2); //这样一传的的话T就是String类型
//注意:我还有可能前面是一个Person类型的数组,后面是一个Person类型的集合;
Person[] objs3 = new Person[]{new Person("HH",55)};
Collection<Person> coll3 = new ArrayList<>();
fromArrayToColllection(objs3, coll3); //这样传T就是Person类型;
/**
* 现在我要描述的是:数组和集合是同一个类型:用泛型的方式,这里面并没有声明这个测试类是泛型类,而且这个数组和集合是时时变化的,但是要求他们之间有个类型的匹配关系;
*/
//然后我想把objs2的元素放到coll2里面去,需要些一个泛型方法;
 }
/**
* 泛型方法:
*    在定义一个类的时候可以定义一个泛型类,那么在定义一个方法的时候我们可以定义一个泛型方法;
*    虽然类没有用泛型类型的类,但是我在方法里面依然可以使用泛型,当然如果类本身就是个泛型类,那么我在里面也可以写其他的泛型方法;
*
*/
//写一个泛型方法:把指定类型数组中的元素放入指定类型的集合中;
/**
*  我在声明这个泛型方法之前必须告诉它是一个泛型方法:
*  泛型方法:在方法声明时,同时声明泛型,在返回值之前声明泛型类型,然后在方法的返回值、参数列表、以及方法体都可以使用泛型类型;
*/
public static <T> void fromArrayToColllection(T[] objs,Collection<T> coll){
}
//在方法体中用泛型的泛型方法:这样写是可以的;
public static <T> T get(Integer id){
T result = null;
return result;
}
}


//Person类
package com.zhou.generic;
public class Person {
//当我重写equals方法集合的移除也会失败
//   @Override
// public boolean equals(Object obj) {
// // TODO Auto-generated method stub
//// return super.equals(obj);
// return false;
// }
//用IDE直接生成hashCode()和equals()方法
//hashCode()方法决定着我们放的这个元素在集合中的位置,如果两个元素比较equals()方法返回fasle的话,那么hashCode()方法返回值应该也不相等,应该放在两个位置;
//反过来,如果equals()方法返回的true的话,那么hashCode()返回值应该也相等,它们是同一个元素,应该放在同一个地方;
/**
* 正常情况下我们这么来做:两个对象的equals()方法返回true,hashCode()方法返回值必相等;
* 通常情况下,我们使用eclipseIDE帮我们生成hashCode()和equals()方法就可以;
* 学习的时候我们可以这样来试一下,不建议开发的时候这样来做,如果equals()方法返回true,它两是同一个元素,但是hashCode()值不一样,那么这两个对象都可以放到这个集合里面去,这个是矛盾的事
*/
/**
* hashCode()方法的要求:
*    HashSet集合判断两个元素相等的标准:两个对象通过equals()方法方法比较返回true相等,并且两个对象的hashCode()方法返回值也相等。
*    如果两个对象通过equals()方法返回true,这两个对象的hashCode值也应该相同;
*
* 重写hashCode()方法的基本原则:
*    1.在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值;
*    2.当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应该相等;
*    3.对象中用作equals()方法比较的(Field)区域,都应该用来计算hashCode值;  
*      
*/
// private static int init = 0;
@Override
public int hashCode() { //这个hashCode值和age的值联合到一起来返回的一个结果
final int prime = 31; //用这个素数是为了防止name的hashCode值和age的值不一样,但是有可能age和name的hashCode值相加得到的那个数可能一样的情况;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
//      return init++;//不允许
}
//这个是一个一个属性比的,这个是IDE自动帮我们生成的equals()方法,这个是可信赖的;
@Override
public boolean equals(Object obj) {
if (this == obj) //如果这两个对象是一个的话,返回true
return true;
if (obj == null) //如果传的这个对象是空的话,返回fasle
return false;
if (getClass() != obj.getClass()) //如果类型不一致的话,返回false
return false;
Person other = (Person) obj; //否则,强转
if (age != other.age) //如果年龄不一样的话,返回false
return false;
if (name == null) { //如果名字为空
if (other.name != null) //另外一个的名字不为空返回fasle
return false;
} else if (!name.equals(other.name)) //如果名字不一样的话,返回fasle
return false;
return true; //否则,最后返回true,表示一样;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
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;
}
private String name;
private int age;
}


本文出自 “IT技术JAVA” 博客,转载请与作者联系!

你可能感兴趣的:(泛型方法)