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
查看全文
相关阅读:
tp6.0使用EasyWeChat
vue-admin-template使用
tp6.0入门
seo一些细节
wordpress开发mac
php加密
小程序信息授权sessionKey失效问题
app爬虫(python)开发——抓包工具的使用详细笔记
app爬虫(python)开发——搭建开发环境(如何抓取app数据?)
app爬虫(python)开发入门到实战个人笔记(目录)
原文地址:https://www.cnblogs.com/vonk/p/3824205.html
最新文章
禁用鼠标右键和f12
参数验证,不传参则报错
js截断数组的几种方法
格式化输出的JSON字符串
input框失焦时文字消失,聚焦时文字出现
js求1000以内对称的数字
js求阶乘和阶乘之和
python求阶乘和阶乘之和
python定义函数和调用函数
人体需要补充的营养物质
热门文章
kubernete yaml设置
kubernetes初始化遇到的错误
vm搭建集群
Chrome dev tool中Step和 Step Into的区别
vite原理
web.dev tooling.report developer.google developer.chrome
Debug键盘设计
macos 控制notification 的相关资料
行测-削弱题型
拉去taro+vue3.0遇到的问题
Copyright © 2011-2022 走看看