8.1 Take Care when Calling Legacy Code

通常,泛型都是在编译时检查的,而不是运行时。便意识检查可以提早通知错误,而不至于到运行时才出问题。

但有时后编译时检查不一定就坚不可摧,因为有时我们在运行时才能之道具体类型。

(唉,翻译水平有限,还是看代码吧)

package java_generics_collections.chap08;

import java.util.ArrayList;
import java.util.List; /**
* Created by jintaox on 2016/3/21.
*/
public class LegacyLibrary {
public static void addItems(List list) {
list.add(new Integer(1));
list.add("two");
} public static List getItems() {
List list = new ArrayList();
list.add(new Integer(3));
list.add("four");
return list;
}
}
使用这段代码的客户端被告知item永远是整数。
package java_generics_collections.chap08;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List; /**
* Created by jintaox on 2016/3/21.
*/
public class NaiveClient {
public static void processItems() {
List<Integer> list = new ArrayList<>();
LegacyLibrary.addItems(list);
List<Integer> list2 = LegacyLibrary.getItems();//unchecked warnings
//sometime later可能过了很久才打算使用list中的数据
int s = 0;
for (int i : list) {
s += i;//class cast exception
}
for (int i : list2) {
s += i;//class cast exception
}
} @Test
public void test_processItems() throws Exception {
processItems();
}
}
当我们对这段代码跑测试的时候,异常如下:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java_generics_collections.chap08.NaiveClient.processItems(NaiveClient.java:18)
at java_generics_collections.chap08.NaiveClient.test_processItems(NaiveClient.java:28)
...
也就是说我们从集合中拿出数据并把它当作`Integer`来用的时候,它抛出了异常,也就是说错误定位我们只能快速到达这里,但究其原因是因为我们在插入的时候,插入了一个`String`类型,
而我们很难定位到这里,只能从头开始读代码。 来看另一个客户端(以下代码是可以通过编译检查)
package java_generics_collections.chap08;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; /**
* Created by jintaox on 2016/3/21.
*/
public class WaryClient {
public static void processItems() {
List<Integer> list = new ArrayList<>();
List<Integer> view = Collections.checkedList(list, Integer.class);
LegacyLibrary.addItems(view);
List<Integer> list2 = LegacyLibrary.getItems();//unchecked
for (int i : list2) {
//class case exception
System.out.println(i);
} } @Test
public void test_processItems() throws Exception {
processItems();
}
}
在这个客户端里面,我们使用了工具类`Collections`中的`checkedList`方法,还是先看运行结果吧
java.lang.ClassCastException: Attempt to insert class java.lang.String element into collection with element type class java.lang.Integer
at java.util.Collections$CheckedCollection.typeCheck(Collections.java:3037)
at java.util.Collections$CheckedCollection.add(Collections.java:3080)
at java_generics_collections.chap08.LegacyLibrary.addItems(LegacyLibrary.java:12)
at java_generics_collections.chap08.WaryClient.processItems(WaryClient.java:16)
at java_generics_collections.chap08.WaryClient.test_processItems(WaryClient.java:27)
看,我们一下就定位到了插入的地方,这样就大大加快我们定位错误的速度。
`checkedList`方法的api介绍: Returns a dynamically typesafe view of the specified collection.

checkedList源码分析待定

加油,我要做Java专家。

Java Generics and Collections-8.1的更多相关文章

  1. python 中的sort 和java中的Collections.sort()函数的使用

    x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...

  2. Java Concurrency - Concurrent Collections

    Data structures are a basic element in programming. Almost every program uses one or more types of d ...

  3. thinking in java Generics Latent typing

    The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...

  4. Thinking in java——Generics

    ​Ordinary classes and methods work with specific types: either primitives or class types. If you are ...

  5. 【Java】Java中的Collections类——Java中升级版的数据结构【转】

    一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数 ...

  6. Java中的Collections类

    转载:https://blog.csdn.net/yangxingpa/article/details/80515963 从[Java]Java中的Collections类——Java中升级版的数据结 ...

  7. Java Generics and Collections-2.3

    2.3 Wildcards with super 这里就直接拿书上的例子好了,这是Collections里面的一个方法: public static <T> void copy(List& ...

  8. java List 排序 Collections.sort() 对 List 排序

    class User { String name; String age;  public User(String name,String age){  this.name=name;  this.a ...

  9. 黑马程序员——JAVA基础之Collections和Arrays,数组集合的转换

    ------- android培训.java培训.期待与您交流! ---------- 集合框架的工具类:        Collections : 集合框架的工具类.里面定义的都是静态方法. Col ...

随机推荐

  1. 在Winform程序中设置管理员权限及为用户组添加写入权限

    在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身 ...

  2. c#自定义日志记录

    废话不多说,直接上代码: 很简单:将类复制到项目中,最后在配置文件上配置一下:logUrl即可. 默认保存在:项目/temp/log /// <summary> /// 日志类 /// & ...

  3. 从零开始学Python08作业思路:开发简单的FTP

    一,作业要求 开发简单的FTP 1,用户登录 2,上传/下载文件 3,不同用户家目录不同 4,查看当前目录下文件 5,充分使用面向对象 二,程序文件清单 Folder目录:用户上传文件家目录 db目录 ...

  4. C标准头文件<stdlib.h>

    是个大杂烩,里面声明了从动态内存分配到常用算法等各种函数和宏 #数据类型 **size_t** **wchar_t** **div_t**是一个结构体类型,也是div()返回的类型 **ldiv_t* ...

  5. Could not publish server configuration for Tomcat v6.0 Server at localhost.

    经常在使用tomcat服务器的时候 总会发生一些莫名其妙的错误. 就像下面这个错误: 在配置文件中存在多个/MyWeb的配置,导致不能发布服务. 错误信息: Could not publish ser ...

  6. Lind.DDD.UoW~方法回调完成原子化操作

    回到目录 本文来自于实践中的不足 在最近开始过程中,遇到了一个问题,之前设计的工作单元UoW只支持Insert,Update,Delete三种操作,即开发人员可以将以上三种操作同时扔进工作单元,由工作 ...

  7. jquery限制文本框只能输入金额

    $("#batch_diff_percent").keyup(function () { var reg = $(this).val().match(/\d+\.?\d{0,2}/ ...

  8. SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试(转)

    原文地址:http://www.cnblogs.com/downmoon/archive/2012/04/19/2456451.html 在<SQL Server 2012服务端使用OFFSET ...

  9. text-align=center 失效原因

    text-align属性是针对 内联元素居中得属性设置,对于块状元素使用margin:0 auto;来控制居中: 笔者在设置一个h2标签时设置了text-align:center;但是却始终出现在中间 ...

  10. 元首的愤怒 SharePoint Apps

    柏林数据中心的服务器机架已经插满.CPU 100%.电力基础设施处在崩溃的边缘,但当元首决定迁移到 Office 365 的时候,将军们却告诉他那里没有 Farm Solution,5 年多的投资将付 ...