Java泛型方法声明基础

Eve*_*Eve 3 java generics declaration

我开始学习GenericsJava,我看几个教程,但我有点迷茫,不知道如何泛型方法声明。

当我使用泛型类型时,定义方法的正确顺序是什么?我找到了这个示例,什么时候需要使用尖括号,什么时候不需要?

public class Box<A> {

    private A a;
    ...

    public void setA(A a) {
        this.a = a;
    }

    public <A> List<A> transform(List<A> in) {
        return null;
    }

    public static <A> A getFirstElement(List<A> list) {
        return null;
    }

    public A getA() {
        return a;
    }
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 5

问题是你的代码使用了相同的字符 A,但它在不同的地方有几个不同的“含义”:

public class Box<T> { 
Run Code Online (Sandbox Code Playgroud)

需要大括号,因为您在这里说的是:Box 使用了一个泛型类型,称为 T。

T go 不带大括号的用法

private T a;
public void setA(T a) {
Run Code Online (Sandbox Code Playgroud)

但是之后

public <T2> List<T2> transform(List<T2> in) {
Run Code Online (Sandbox Code Playgroud)

正在引入另一个类型参数。我把它命名为T2,使之清楚,这是一样的T.的想法是,在范围T2的是唯一的一个方法transform。其他方法不知道T2!

public static <A> A getFirstElement(List<A> list) {
Run Code Online (Sandbox Code Playgroud)

与上面相同 - 此处为“T3”;-)

编辑您的评论:您不能让静态方法使用类范围的类型 T。这根本不可能!看看这里为什么会这样!

编辑 2:泛型允许您编写通用代码(因为它可以处理不同的类);但仍然给你编译时安全。例子:

 Box<String> stringBox = new Box<>();
 Box<Integer> integerBox = new Box<>();
 integerBox.add("string"); // gives a COMPILER error!
Run Code Online (Sandbox Code Playgroud)

在人们有泛型之前,他们只能到处处理Object;和手工铸造。