泛型

一、泛型(JDK1.5的一个新特性)
  泛泛的类型,不确定的类型,可以用应用于不同的类、接口、方法等。

格式

<E>

(E)只是一个类型符号,本质是一个变量,等待接收的是一种数据类型。

1.使用泛型的好处

  • 将运行时期的ClassCastException转换为编译时期的编译错误。
  • 避免类型强转的麻烦。

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
demo01();
demo02();
}

//不使用泛型(不写<E>)
public static void demo01() {
ArrayList names=new ArrayList();
names.add(123);
names.add(true);
names.add("asd");

for(Object i:names)
{
String s=(String)i; //强制类型转换
System.out.println(s);
}
}

//使用泛型
public static void demo02() {
ArrayList<String> names=new ArrayList<String>();  //使用泛型进行创建
names.add("123");
names.add("asded0");
names.add("asd");

for(String i:names)
{
System.out.println(i);
}
}
}

代码结果分析:
执行demo01()方法:
不使用泛型的话,编译时期没有错误,但是执行就会报错。
  Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at Main.demo01(Main.java:17)
at Main.main(Main.java:4)

执行demo02()方法:
使用泛型()的话,可以将其转换到编译时期出错。
  123
  asded0
  asd

扩展:
可以使用迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.*;
public class Main {
public static void main(String[] args) {
demo01();
}
//使用迭代器
public static void demo01() {
ArrayList<String> names=new ArrayList<String>(); //定义names对象
names.add("123"); //使用add方法
names.add("asded0");
names.add("asd");
Iterator<String> s=names.iterator(); //对象生成迭代器
while(s.hasNext()) //判断是否由下一个
{
String a=s.next(); //当前位置的值传给a
System.out.println(a); //输出a然后指针自动后移下一个
}
}
}

二、泛型类
格式:
**   public class 类名<E>
**
 注:当你创建类对象的时候,会确定对应的E是那个类型,增加了你的多项选择!

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Main {
public static void main(String[] args) {
//创建一个Person
Person p=new Person();
p.setAaa("123"); //报错(只有int可以)


}
}

public class Person{
E aaa;
public int getAaa() {
return aaa;
}

public int setAaa(int aaa) {
this.aaa = aaa;
}

}

  如果这样,p。setAaa方法会报错,因为set方法要返回的是int型,而我定义的p对象调用方法给的是String类型的,会报错。

使用泛型类:
1. Person后面加一个<E>
2. 然后将set和get方法返回值都改为E

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Main {
public static void main(String[] args) {
//创建一个Person
Person p=new Person();
p.setAaa("123");

//创建一个Person<E>
Person<String> pp=new Person<String>;
pp.setAaa("ASD"); //可以设置String的

//创建一个Person<E>
Person<Integer> pp=new Person<Integer>;
pp.setAaa(123); /可以设置int的
}
}

public class Person<E>{
E aaa;

public E getAaa() {
return aaa;
}

public void setAaa(E aaa) {
this.aaa = aaa;
}
}

三、泛型方法(少用)
格式:
**   public <T> 返回值类型 方法名(T t);
**
 注:当你调用方法,传递参数的时候确定。

1
2
3
4
5
6
7
8
//Main方法调用
Person<String> pp2=new Person<String>();
pp2.show("asd");

//Person类里面的一个泛型方法:
public <T> void show(T t) {
System.out.println(t);
}

四、泛型接口
格式:
**   public interface 接口名 <E>
**

  1. 当子类实现接口时候,确定接口的泛型。
  2. 当子类实现接口时候,还是不确定泛型,把接口的泛型继续实现下来(就跟抽象类一样,如果实现类没有覆盖重写所有的抽象方法,那么继续让它的实现类实现)

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
,