在中文中,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的温床。
如果使用泛型,就不需要使用转换操作了,而且能够在编译错误中发现问题。
总结
为了实现类型的灵活性和代码的可维护性,泛型是必需的。