本文针对有一定泛型基础人员。
Java 泛型类
public class Itpow<T> { public void func(T p) { } }
Java 泛型方法
public class Itpow<T> { public <TResult> TResult func(T p, TResult p2) { } }
泛型方法是在方法返回值前面 <>。
Java 泛型类型不能是基础类型
Itpow<int> obj = new Itpow<>(); // 错误。 Itpow<Integer> obj = new Itpow<>(); // 正确。
如上,不能使用 int 基础类型,要换作 Integer 引用类型。
在 C# 等语言中,则无此限制。
Java 泛型类型如何限定类型?
<T extends MyList>
如上,在使用泛型时,就只能是 MyList 派生类,或 MyList 类型(假如 MyList 是类)。
注意:extends 后面可以跟一个类、多个接口,使用 & 连接,类必须排在前面。
Java 泛型如何声明多个泛型?
使用逗号隔开,比如:
<T1, T2>
Java 泛型类型的继承
class Animal { } class Cat extends Animal { } class Dog extends Animal { } class Itpow{ public void gogogo(List<Animal> animals) { } }
调用:
List<Cat> cats = new ArrayList<>(); cats.add(new Cat()); List<Dog> dogs = new ArrayList<>(); dogs.add(new Dog()); Itpow itpow = new Itpow(); itpow.gogogo(cats); itpow.gogogo(dogs);
如上调用 gogogo,是会出错的,怎么改呢?
public void gogogo(List<Animal> animals)
改为:
public void gogogo(List<? extends Animal> animals)
此时支持 Animal 自身及其子类。
当然,如果确实不改 gogogo,也可以这样来调用,不过这是另一个层面的意思了:
List<Animal> animals = new ArrayList<>(); animals.add(new Cat()); Itpow itpow = new Itpow(); itpow.gogogo(animals);
还有一种反过来,只允许自身及其超类 <? super Cat>,那种是用于设置值的,但是着实没多少应用场景。