Java进阶之泛型:类型安全的魔法✨
泛型是Java5引入的一项重要特性,它让我们的代码更加安全、优雅且可重用。让我们深入探索这个强大的工具吧!🚀
为什么需要泛型?🤔
在泛型出现之前,我们只能使用Object类型来编写通用代码,这会导致类型不安全:
```java
Listlist=newArrayList();
list.add("hello");
Strings=(String)list.get(0);//需要强制类型转换
```
有了泛型,我们可以明确指定集合中元素的类型:
```java
Listlist=newArrayList<>();
list.add("hello");
Strings=list.get(0);//无需强制转换,编译器保证类型安全
```
泛型类与泛型方法🧩
我们可以创建自己的泛型类:
```java
publicclassBox{
privateTt;
publicvoidset(Tt){this.t=t;}
publicTget(){returnt;}
}
BoxintegerBox=newBox<>();
integerBox.set(10);
intvalue=integerBox.get();//自动拆箱
```
泛型方法可以在非泛型类中使用:
```java
publicstaticTgetMiddle(T...a){
returna[a.length/2];
}
Stringmiddle=getMiddle("John","Q.","Public");//自动推断为String
```
类型通配符与边界🌈
有时我们需要更灵活的类型约束:
```java
//上界通配符-接受Number及其子类
publicstaticdoublesumOfList(Listlist){
doublesum=0.0;
for(Numbernum:list){
sum+=num.doubleValue();
}
returnsum;
}
//下界通配符-接受Integer及其父类
publicstaticvoidaddNumbers(Listlist){
for(inti=1;i<=10;i++){
list.add(i);
}
}
```
泛型擦除与限制⚠️
Java的泛型是通过类型擦除实现的,这意味着泛型信息在运行时不可用:
```java
Liststrings=newArrayList<>();
Listintegers=newArrayList<>();
System.out.println(strings.getClass()==integers.getClass());//输出true!
```
因此,我们不能:
-创建泛型数组`newT[10]`❌
-使用基本类型作为类型参数`List`❌
-在静态上下文中使用类型参数❌
泛型让我们的代码更加类型安全,减少了运行时错误,是Java开发者必须掌握的进阶技能!💪通过合理使用泛型,可以编写出更灵活、更健壮的代码。🎯
泛型是Java5引入的一项重要特性,它让我们的代码更加安全、优雅且可重用。让我们深入探索这个强大的工具吧!🚀
为什么需要泛型?🤔
在泛型出现之前,我们只能使用Object类型来编写通用代码,这会导致类型不安全:
```java
Listlist=newArrayList();
list.add("hello");
Strings=(String)list.get(0);//需要强制类型转换
```
有了泛型,我们可以明确指定集合中元素的类型:
```java
Listlist=newArrayList<>();
list.add("hello");
Strings=list.get(0);//无需强制转换,编译器保证类型安全
```
泛型类与泛型方法🧩
我们可以创建自己的泛型类:
```java
publicclassBox{
privateTt;
publicvoidset(Tt){this.t=t;}
publicTget(){returnt;}
}
BoxintegerBox=newBox<>();
integerBox.set(10);
intvalue=integerBox.get();//自动拆箱
```
泛型方法可以在非泛型类中使用:
```java
publicstaticTgetMiddle(T...a){
returna[a.length/2];
}
Stringmiddle=getMiddle("John","Q.","Public");//自动推断为String
```
类型通配符与边界🌈
有时我们需要更灵活的类型约束:
```java
//上界通配符-接受Number及其子类
publicstaticdoublesumOfList(Listlist){
doublesum=0.0;
for(Numbernum:list){
sum+=num.doubleValue();
}
returnsum;
}
//下界通配符-接受Integer及其父类
publicstaticvoidaddNumbers(Listlist){
for(inti=1;i<=10;i++){
list.add(i);
}
}
```
泛型擦除与限制⚠️
Java的泛型是通过类型擦除实现的,这意味着泛型信息在运行时不可用:
```java
Liststrings=newArrayList<>();
Listintegers=newArrayList<>();
System.out.println(strings.getClass()==integers.getClass());//输出true!
```
因此,我们不能:
-创建泛型数组`newT[10]`❌
-使用基本类型作为类型参数`List`❌
-在静态上下文中使用类型参数❌
泛型让我们的代码更加类型安全,减少了运行时错误,是Java开发者必须掌握的进阶技能!💪通过合理使用泛型,可以编写出更灵活、更健壮的代码。🎯
271

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



