zoukankan
html css js c++ java
java泛型问题 关于警告:XX is a raw type
(本文例子适用于JDK 5.0, 学习请先安装并配置!!!)
我们从一个简单的例子开始:假设我们现在需要一个专用来存储字符串的List,该如何实现?呵呵,这还不简单,且看如下代码:
public static void main(String[] args)
{
List strList = new ArrayList();
strList.add("one");
strList.add("two");
}
相信很多人都有过这样写的经历,不错,这个写法确实没有错。以前我们甚至都是这么做的。但是不是说要与时俱进么?这样的写法到今天来看,却就有问题了。问题来源于我们的需求,我们需要的是一个专门用来存储字符串的List,现在请在这段程序代码后面加一句,使之变成这样:
public static void main(String[] args)
{
List strList = new ArrayList();
strList.add("one");
strList.add("two");
strList.add(new Integer(1));
}
然后运行检查一下,可以运行!是个好消息,别高兴,问题就在于这个List能正常运行(记住:程序员要求的不是程序能运行)。回头看看,我们的需求是这个List专门用来存储字符串,但是现在,这个List竟然还可以存储一个整型数据。也许你会说,Java类库定义的不就是可以存储任意一个Object 么?是的,没错,但是现在我们的需求范围变小了,只需要存储字符串。别说我是钻牛角尖,我们看一个更普遍的问题:当我们操作数据库的时候,我们经常会返回一张表的所有数据,在我们通过实体关系映射之后,我们得到的就是一系列相同类型的数据,通常我们采取的操作是用一个List来保存这一系列的数据,但是由于这些数据都具有相同的类型,因此,这个List也就成了一个保存单一对象的List了。看到这里,我想对于我这个例子的目的大家应该清楚了。
现在我们来讨论一下问题的解决之道,一句话来总结就是我们需要一个只能操作单一类型的List。方法就在这里,Java 5给我们提供了解决之道-----Generic,对于我们的这个例子来说,Java5的类型安全要发挥作用了。
现在我们回到程序清单一,打开你的开发工具,编译一下(Eclipse等工具下面不用你自己变异就可以看到),我们发现程序虽然没有错误,但是却有一个警告:
Type safety: The method add(Object) belongs to the raw type List.
References to generic type List should be parameterized
看见了么, JavaTiger给你警告了,警告的来源就是上面所说的类型安全。如果你查询一下Javadoc,你会发现List 是这样定义的 :
Public interface List<E> extends Collection,Iterable
注意这个<E>,它就是JavaTiger的类型安全标志,我想,到这里可以给出在保证类型安全时我们例子中的List应该如何定义了:
List<String> strList = new ArrayList<String>();
在理解这条语句之前请先记住,以后这就是List的官方写法了(^_^)。现在来看一下,在List之后我们有<String>这样的标志,在JavaTiger里面,这就是类型安全的定义方法,结合这条语句,很容易就可以看出,我们定义了一个用来存储String类型的List。来看看重新定义后的效果:
public static void main(String[] args)
{
List<String> strList = new ArrayList<String>();
strList.add("one");
strList.add("two");
}
再编译一下或者直接在Eclipse里面观察,先前的警告没有了。
到此,应该说我们已经掌握了类型安全的基本用法了,现在我么来个小小的改变,将List 的定义改成这样:
List<String> strList = new ArrayList();
呵呵,警告又回来了。虽然我们在这里对List定义了String类型,但是我们在实例化的时候去却没有指定,因此出现了这个警告,所以记住上面讲的官方写法。
现在回来,让我们来验证一下这个保证了类型安全的List是不是安全的。让我们还是通过向这个list 添加一个整型数据来验证:
public static void main(String[] args)
{
List<String> strList = new ArrayList<String>();
strList.add("one");
strList.add("two");
strList.add( new Integer(1) );
}
结果竟然出错了(这可不是警告啊!) 是不是很神奇?看一下出错的消息:
The method add(String) in the type List is not applicable for the arguments (Integer)
效果很明显,这个List的add方法已经只能接受String类型的参数了,Javadoc中的add( Object obj )方法已经不能用了,现在大家都应该很满意了吧,我们的需求达到了,这个List太安全了,呵呵。想想它带来的好处,以后当我们要处理一个List中间的元素时,再也不需要这么写了:
String str = (String) list.get( i );
有了类型安全,我们可以直接书写:
String str = list.get( i );
也许这还不以让你来满意,但是看这样一个方法吧:
public List<String> getStrList( List<String> list )
{
.....
return XXX;
}
这就是参数化类型的威力,别告诉我说你觉得这个方法没有什么特别的。
好了,我想我的目的应该已经达到了,大家应该明白Java5里面的类型安全是怎么回事以及如何运用了,好吧,为了让大家心里更有底,再写两行代码让大家看看:
Map<Integer,String> myMap = new HashMap<Integer ,String>();
Set<MyClass> set = new HashSet<MyClass>(0);
不用再举例了吧,这几个例子够直白了吧。
在本文结束的时候,让我们又回到程序清单一,先前不是有警告么?如果你是这样一个人,既不想用类型安全来消除警告,又不想要看到那个讨厌的Waining,你可以在main方法以前加上这么一句(如果你用IDE的话可以自动来完成):
@SuppressWarnings("unchecked") 。
使程序变成这样:
@SuppressWarnings("unchecked")
public static void main(String[] args)
{
List strList = new ArrayList();
strList.add("one");
strList.add("two");
strList.add( new Integer(1) );
}
这下子我想就算你如此挑剔也应该满足了,既没有类型安全,也没有警告了。为什么?关键在于我们添加的那行语句,它也是 JavaTiger的新特性之一Annotation
查看全文
相关阅读:
寒假特训——搜索——H
寒假特训——I
寒假训练——搜索 K
three.js 加载STL文件
three.js 加载3DS 404 文件找不到
C# 请求数据 方式1
学习 一个简单的业务处理
ABP 05 创建Model 以及 相应的增删改查
ABP 04 用户的创建
ABP 00 常用知识
原文地址:https://www.cnblogs.com/vonk/p/3824205.html
最新文章
《V8源码分析》
《你不知道的JavaScript[下卷]》【15】—— ES6语法
《你不知道的JavaScript[中卷]》【14】——asynquence 附录
干货 | Python进阶系列之学习笔记(二)
PyTorch Hub发布!一行代码调用最潮模型,图灵奖得主强推
干货 | Python进阶之学习笔记(一)
【收藏】2019阿里巴巴面试题集锦(含答案)
1+1>2:MIT&IBM提出结合符号主义和连接主义的高效、准确新模型
学霸双胞胎开源斯坦福CS 221人工智能备忘录,图文并茂看懂反射、状态、变量、逻辑...
南京大学周志华教授综述论文:弱监督学习
热门文章
迁移学习之零次学习最新研究综述 | 前沿
如何入手卷积神经网络
万字综述,核心开发者全面解读PyTorch内部机制
A
B
E. Magic Stones CF 思维题
C. Ayoub and Lost Array cf dp
J
tape ——cf
寒假训练——搜索——C
Copyright © 2011-2022 走看看