从这一章开始讲解关于泛型以及将泛型的好处最大化并将其负面影响最小化。
每日一问:为啥不要使用原始类型???
比如以下代码,往原始类型LIst里放几个不同类型的对象:
public class HelloWorld2 {
public void test1() {
}
public static void test2() {
}
public static void main(String[] args) {
List list = new ArrayList();
list.add("沉默的羔羊");
list.add(18);
list.add(new HelloWorld2());
System.out.println(list);
}
}
结果:
[沉默的羔羊, 18, com.example.alibaba.test.HelloWorld2@7a4f0f29]
Process finished with exit code 0
有人会说,这样不是挺好的么,想放什么就放什么。那么问题来了?我取数据应该怎么取?
public static void main(String[] args) {
List list = new ArrayList();
list.add("沉默的羔羊");
list.add(18);
list.add(new HelloWorld2());
System.out.println(list);
// 取数
for (Object o : list ) {
String s = (String) o;
System.out.println(s);
}
}
}
结果:
[沉默的羔羊, 18, com.example.alibaba.test.HelloWorld2@7a4f0f29]
沉默的羔羊
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at com.example.alibaba.test.HelloWorld2.main(HelloWorld2.java:22)
Process finished with exit code 1
以String类型取数据,取到其他类型时出现了异常,要想全部取出数据:
// 取数
for (Object o : list) {
if (o instanceof String) {
String s = (String) o;
System.out.println(s);
} else if (o instanceof Integer) {
Integer i = (Integer) o;
System.out.println(i);
} else if (o instanceof HelloWorld2) {
HelloWorld2 helloWorld2 = (HelloWorld2) o;
System.out.println(helloWorld2);
}
}
结果:
沉默的羔羊
18
com.example.alibaba.test.HelloWorld2@7a4f0f29
Process finished with exit code 0
这样的代码是不是可读性、可维护性实在是太差了!
使用原始类型是合法的,但这么做,就会失去泛型在安全性和表现力等方面的所有优势。
注:本文没有使用原书中案例是因为书中案例不太简单易懂。
所有文章无条件开放,顺手点个赞不为过吧!