在中文中,Java的<>代表什么?

引入

大家好,我是KeChon。
大家有在使用泛型吗?
我今天第一次学习到了。
其实之前一直装作没看见过,但终于遇到了学习的机会。

在与泛型相遇的情境中

我认为第一次相遇一般会在名单上。我想你可能说过这样的话。

List<String> list = new ArrayList<>();

我只知道这是一个可变长数组。
使用<>的类被称为泛型类。

你在这个工作中扮演什么角色?

List<String> list

首先是这部分。
List本身是一个类似数组的接口,它可以存储并处理多个元素。
它不仅可以存储String类型的对象,还可以存储各种类型的对象(仅限于一种类型)。
而上面的声明是指定要存储String类型的元素。


new ArrayList<>();

接下来是这部分。<>之间是空的,但这只是省略的(可以通过左边的String来推断出类型)。

一般的的通用药

在不仅限于列表的更广泛视角下,让我们来探讨一下泛型。下面是一个简单的定义。


public class Gene<T> {
    private T t;

    public void setT(T t) {
        this.t = t;
    }

    public T getT() {
        return t;
    }
}

以下是使用方法。

Gene<String> g1 = new Gene<>(); // String型で固定
Gene<Integer> g2 = new Gene<>(); // Integer型で固定
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24

为什么感到高兴?

在这个例子中,我们可以看到对于同一个类,可以使用多个不同的类。

不,不,这个怎么样?

public class GeneObj {
    Object t;

    public void setT(Object t) {
        this.t = t;
    }

    public Object getT() {
        return t;
    }
}

让我们尝试使用 Object 类来替代之前限定于 T 类型的部分。那么就让我们开始使用吧!

GeneObj g1 = new GeneObj(); 
GeneObj g2 = new GeneObj(); 
g1.setT("test");
System.out.print(g1.getT()); // test
g2.setT(24);
System.out.print(g2.getT()); // 24

我们可以用相同的代码编写。

总结

不使用泛型也是可以的吗?

不不不

在这个例子中,两种方法都可以运行,但是使用Object会存在问题。
简单来说,这个类很难使用。

使用该示例时会导致运行时错误。


GeneObj g1 = new GeneObj(); // String型で固定
g1.setT("1");
Integer res = (Integer) g1.getT() + 1; //ClassCastExceptionの発生
System.out.print(res);

在上面的代码中,错误地将String放入了Integer类型的变量中。
因此,在将其转换为Integer类时发生了ClassCastException。
对于使用者来说,必须了解自己设置的类型,否则会成为bug的温床。
如果使用泛型,就不需要使用转换操作了,而且能够在编译错误中发现问题。

总结

为了实现类型的灵活性和代码的可维护性,泛型是必需的。

bannerAds