1不使用泛型
不定义泛型类型时:
- List的接口变为Object类型:
- void add(Object)
- Object get(int)
- 编译器警告
- 此时只能把<T>当做Object使用
List list = new ArrayList();
list.add("Hello");
list.add("world");
Object first = list.get(0);
Object second = list.get(1);
2使用泛型
定义泛型类型<String>:
- List<T>的泛型接口变为强类型:
- void add(String)
- String get(int)
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("world");
String first = list.get(0);
String second = list.get(1);
可以省略编译器能自动推断出的类型
List<Number> list = new ArrayList<Number>();
//可以省略后面的Number,编译器可以自动推断类型:
List<Number> list = new ArrayList<> ();
3举例说明
Arrays.sort()
Arrays.sort()可以对Object[]数组进行排序:
String[] strs = ["Apple","Pear","Orange"];
Arrays.sort(strs);
System.out.println(Arrays.toString(strs));
//{"Apple","Orange","Pear"}
待排序的元素需要实现Comparable<T>泛型接口:
public interface Comparable<T> {
/**
*返回-1:当前实例比参数o小
*返回0:当前实例与参数o相等
*返回1:当前实例比参数o大
*/
int comparaTo(T o);
}
class Person implements Comparable<Person> {
private String name;
private int score;
public int compareTo(Person o){
if (this.score<o.score){
return -1;
}else if (this.score>o.score) {
return 1;
}else {
return this.name.compareTo(o.name)
}
}
}
4代码演示
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Test") ;
String first = list.get(0);
System.out.println(first);
String[] strs = {"Apple","Pear","Orange"};
Arrays.sort(strs);
System.out.println(Arrays.toString(strs));
Student[] ss = {new Student("Xiao Ming",59),new Student("Xiao Hong",39),new Student("Xiao Hei",53)};
Arrays.sort(ss);
System.out.println(Arrays.toString(ss));
}
}
public class Student implements Comparable<Student>{
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String toString() {
return "Student (" + name + ", " + score +")";
}
@Override
public int compareTo(Student o) {
if (this.score < o.score) {
return -1;
}
return 1;
}
}
5总结
- 使用泛型时,把泛型参数<T>替换为需要的class类型:List<String> list = new ArrayList<String>();
- 可以省略编译器自动推断出的类型:List<String> list = new ArrayList<>();
- 不指定泛型参数类型时,编译器会给出警告,且只能将<T>视为Object类型