- 在ArrayList中使用泛型存储自定义对象示例:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
- 然后在
ArrayList
中使用泛型存储Person
对象:
import java.util.ArrayList;
import java.util.List;
public class GenericArrayListExample {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Bob", 30);
personList.add(person1);
personList.add(person2);
for (Person person : personList) {
System.out.println("Name: " + person.getName() + ", Age: " + person.getAge());
}
}
}
- 使用泛型比不使用泛型的优势:
- 类型安全:
- 不使用泛型时,
ArrayList
可以存储任何类型的对象,这可能导致运行时错误。例如:
import java.util.ArrayList;
import java.util.List;
public class NonGenericArrayListExample {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Person("Charlie", 35));
list.add("This is a string, not a Person object");
for (Object obj : list) {
Person person = (Person) obj; // 这里会抛出ClassCastException,因为第二个元素不是Person类型
System.out.println("Name: " + person.getName() + ", Age: " + person.getAge());
}
}
}
- 使用泛型后,编译器会在编译时检查类型,不允许添加不匹配的类型,从根本上避免了这种运行时的类型转换错误。
- 代码可读性增强:
- 使用泛型明确了集合中存储的对象类型,代码阅读者能更清晰地知道集合的用途。例如
List<Person>
,一看就知道这个列表是用来存储Person
对象的,而不使用泛型时List
则需要查看代码逻辑才能明白其存储对象类型。
- 避免不必要的类型转换:
- 不使用泛型从集合中取出对象时,需要进行强制类型转换。使用泛型后,从集合中取出的对象已经是指定类型,无需强制类型转换,使代码更简洁,也减少了出错的可能性。例如在上述使用泛型的代码中,遍历
personList
时直接得到Person
类型对象,而不使用泛型则需要(Person) obj
这样的强制类型转换。