§ ITPOW >> 文档 >> Java

Java 泛型类和泛型方法

作者:vkvi 来源:ITPOW(原创) 日期:2022-11-28

本文针对有一定泛型基础人员。

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>那种是用于设置值的,但是着实没多少应用场景。

相关文章