抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

为啥引入泛型

进入话题前,先看一段代码:

1
2
3
4
5
6
private static Integer add(Integer a,Integer b){
return a+b;
}
private static Double add(Double a,Double b){
return a+b;
}

通常情况下,我们给一个方法设定形参时,会直接写上形参的类型。但是,当我们的方法传参不确定类型时,例如方法add的形参是Integer,Integer或者是Double,Double,这时要是传来Integer,Double,你可能会去写重载该方法,使其达到一个方法实现接受几种参数类型这就很折磨人了。为了解决这种麻烦,引入泛型。

引用泛型

1
2
3
private static <T extends Number> double addt(T a,T b){
return a.doubleValue()+b.doubleValue();
}

这样,无论调用这传递什么样的数字类型,都可以调用该方法,不用再去重载方法了。

在集合中,List<String>代表着List只能存放String类型,用来表示约束。

泛型的使用

泛型类

单一泛型类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Hello<T>{
private T word;

public T getWord() {
return word;
}

public void setWord(T word) {
this.word = word;
}
}
public class test {
public static void main(String[] args) {
Hello<String> hello = new Hello<String>();
hello.setWord("你好,泛型");
// 你好,泛型
System.out.println(hello.getWord());
Hello<Integer> hello1 = new Hello<Integer>();
hello1.setWord(12323);
// 12323
System.out.println(hello1.getWord());

}
}

多元泛型类:

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
class Notepad<K,V>{
private K key;
private V value;

public K getKey() {
return key;
}

public void setKey(K key) {
this.key = key;
}

public V getValue() {
return value;
}

public void setValue(V value) {
this.value = value;
}
}

public class test {
public static void main(String[] args) {
Notepad<String, Integer> notepad = new Notepad<>();
notepad.setKey("tom");
notepad.setValue(20);
System.out.println(notepad.getKey());
System.out.println(notepad.getValue());
}
}

泛型接口

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
interface Hello<T>{
public T getWord();
}

class HelloImpl<T> implements Hello<T>{
private T word;

public HelloImpl(T word) {
this.word = word;
}
public void setWord(T word) {
this.word = word;
}
@Override
public T getWord() {
return this.word;
}
}

public class test {
public static void main(String[] args) {
HelloImpl<String> hello = new HelloImpl<String>("你好,接口泛型");
System.out.println(hello.getWord());
}

}

泛型方法

1
2
3
public <T> T get(T a) {
return a;
}
  1. <T>:声明一个泛型T
  2. T:声明方法的返回类型是泛型T
  3. get(T a):方法的形参是一个泛型T的变量

上述中,1是必须申明的,2,3可以视情况使用其中之一或者两者一起使用。假如两者都使用,虽然没有问题,但是方法却没有涉及<T>,属于无效代码。


参考:泛型机制详解](https://pdai.tech/md/java/basic/java-basic-x-generic.html)

评论