返回

如何在Java和Kotlin泛型中使用in,out,where

Android

泛型的基础知识

在深入研究in,out和where之前,让我们先快速回顾一下泛型的基础知识。

泛型允许您创建可与不同类型一起工作的类和函数。这可以提高代码的可重用性,并使您的代码更易于维护。

要创建泛型类,您需要使用类型参数。类型参数是占位符,用于在类定义中表示类型。例如,以下代码定义了一个名为Box的泛型类,它可以存储任何类型的对象:

public class Box<T> {

    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

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

类型参数T表示存储在Box实例中的对象的类型。您可以将任何类型的对象传递给Box构造函数,Box将自动调整其类型以匹配该对象。

in和out

in和out是Java和Kotlin泛型中的两个,用于指定类型参数的协变性和逆变性。

协变性意味着您可以将子类型传递给类型参数,并且仍然可以安全地使用它。例如,以下代码是合法的:

Box<Dog> dogBox = new Box<>(new Dog());

Box<Animal> animalBox = dogBox;

因为DogAnimal的子类,所以您可以将Box<Dog>安全地赋值给Box<Animal>

逆变性意味着您可以从类型参数中获取超类型,并且仍然可以安全地使用它。例如,以下代码是合法的:

Box<Animal> animalBox = new Box<>(new Animal());

Box<Dog> dogBox = animalBox;

Dog dog = dogBox.getValue();

因为AnimalDog的超类,所以您可以将Box<Animal>安全地赋值给Box<Dog>

where

where关键字用于指定类型参数的类型约束。类型约束允许您限制类型参数可以是哪些类型。例如,以下代码定义了一个泛型函数,它只接受实现了Comparable接口的类型:

public static <T extends Comparable<T>> T max(T a, T b) {
    if (a.compareTo(b) > 0) {
        return a;
    } else {
        return b;
    }
}

Java和Kotlin泛型代码示例

以下是一些Java和Kotlin的泛型代码示例:

// Java

// 定义一个泛型类
class Box<T> {

    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

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

// 定义一个泛型函数
public static <T extends Comparable<T>> T max(T a, T b) {
    if (a.compareTo(b) > 0) {
        return a;
    } else {
        return b;
    }
}

// Kotlin

// 定义一个泛型类
class Box<T>(private val value: T) {

    fun getValue(): T {
        return value
    }

    fun setValue(value: T) {
        this.value = value
    }
}

// 定义一个泛型函数
fun <T : Comparable<T>> max(a: T, b: T): T {
    if (a > b) {
        return a
    } else {
        return b
    }
}

结论

泛型是Java和Kotlin编程语言中的强大功能,允许您创建可重用的代码并提高安全性。in、out和where关键字用于指定类型参数的协变性和逆变性,以及类型约束。