💁 个人主页:黄小黄的博客主页
❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
🎏 格言:All miracles start from sometime somewhere, make it right now.
本文来自专栏:JavaSE从入门到精通
我们来引入一个需求,在ArrayList集合中添加三个Dog对象,并遍历该集合,输出Dog对象的姓名。这点我们很容易做到,只需要在遍历的时候将Object对象向下转型为Dog就可以正常遍历了。但是,假如程序员在添加Dog对象时不小心添加了一只猫呢? 来看下面的代码:
import java.util.ArrayList;
/**
* @author 兴趣使然黄小黄
* @version 1.0
*/
public class Generic0 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
Dog dog1 = new Dog("小黄");
Dog dog2 = new Dog("小花");
Cat cat = new Cat("猫猫");
arrayList.add(dog1);
arrayList.add(dog2);
arrayList.add(cat); // 不小心添加了一只猫
// 遍历
for (Object o :
arrayList) {
// 向下转型
Dog dog = (Dog) o;
System.out.println(dog.name);
}
}
}
class Dog{
public String name;
public Dog(String name) {
this.name = name;
}
}
class Cat{
public String name;
public Cat(String name) {
this.name = name;
}
}

🐱 传统方法可能遇到的问题:
而通过使用泛型,则可以很好的解决该类问题。
在创建 ArrayList 的时候,通过下面的语句使用泛型,限制元素的类型:
ArrayList<Dog> arrayList = new ArrayList<>();
则编译器就会对类型进行检查,避免了将Cat加入ArrayList的错误情况:

🐰 泛型的好处:
🐱 简介:
ClassCastException 异常。同时,代码更加简洁、健壮;class Person<E>{
E element; // E 表示 element 的数据类型,该数据类型在定义 Person 对象的时候指定,即在,编译期间,就确定E的类型
public Person(E element){ // E 也可以是参数类型
this.element = element;
}
public E method(){ // 返回类型为E
return element;
}
}
1.创建 3 个学生对象;
2.放入HashSet中,元素为Student;
3.通过遍历HashSet,将值放入到 HashMap 中,Key 为 String name(HashSet中的Student), Value 为学生对象;
4.使用两种方式遍历,HashMap。
import java.util.*;
/**
* @author 兴趣使然黄小黄
* @version 1.0
*/
public class Generic2 {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
students.add(new Student("黄小黄", 20));
students.add(new Student("祢豆子", 7));
students.add(new Student("春卷儿", 19));
HashMap<String, Student> hashMap = new HashMap<>();
// 遍历 HashSet,并将值传入 HashMap
Iterator<Student> studentIterator = students.iterator();
while (studentIterator.hasNext()){
Student s = studentIterator.next();
hashMap.put(s.name, s);
}
// 遍历 HashMap
System.out.println("=================== 方式一 ==================");
Set<String> keySet = hashMap.keySet();
for (String s :
keySet) {
System.out.println(s + "--->" + hashMap.get(s));
}
System.out.println("=================== 方式二 ==================");
Set<Map.Entry<String, Student>> entrySet = hashMap.entrySet();
for (Map.Entry es :
entrySet) {
System.out.println(es.getKey() + "--->" + es.getValue());
}
}
}
// 学生类
class Student{
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}



🆔 基本语法:
class 类名<T, R...>{
...
}
🆔 基本语法:
interface 接口名<T, R...>{
...
}
🆔 基本语法:
修饰符 <T, R...>返回类型 方法名(参数列表){
...
}
泛型方法,可以定义在普通类中,也可以定义在泛型类中;
当泛型方法被调用时,类型就会确定;

public void f(E e){},修饰符后面没有
泛型方法,可以使用类声明的泛型,也可以使用自己声明的泛型。

🐰 通配示例如下,具体见注释:
import java.util.List;
/**
* @author 兴趣使然黄小黄
* @version 1.0
*/
public class Generic3 {
// > 任意泛型
public static void printCollection01(List<?> c){
for (Object object:
c) {
System.out.println(object);
}
}
// extends A> A表示上限,可以接受A或者A的子类
public static void printCollection02(List<? extends A> c){
for (Object object:
c) {
System.out.println(object);
}
}
// super A> A表示下限,可以接受A以及A的父类
public static void printCollection03(List<? super A> c){
for (Object object:
c) {
System.out.println(object);
}
}
}
class C{}
class A extends C{}
class B extends A{}
🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!

共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
