为啥引入泛型
进入话题前,先看一段代码:
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); 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; }
|
<T>:声明一个泛型T
T:声明方法的返回类型是泛型T
get(T a):方法的形参是一个泛型T的变量
上述中,1是必须申明的,2,3可以视情况使用其中之一或者两者一起使用。假如两者都使用,虽然没有问题,但是方法却没有涉及<T>,属于无效代码。
参考:泛型机制详解](https://pdai.tech/md/java/basic/java-basic-x-generic.html)