[首页]
[文章]
[教程]
首页
Web开发
Windows开发
编程语言
数据库技术
移动平台
系统服务
微信
设计
布布扣
其他
数据分析
首页
>
编程语言
> 详细
java泛型问题
时间:
2015-01-06 13:55:26
阅读:
230
评论:
0
收藏:
0
[点我收藏+]
public st
a
tic void m
a
in(String[]
a
rgs)
{
L
is
t
strL
is
t
=
n
e
w
ArrayList
();
strL
is
t.
a
dd("on
e
");
strL
is
t.
a
dd("two");
}
相信很多人都有过这样写的经历,不错,这个写法确实没有错。以前我们甚至都是这么做的。但是不是说要与时俱进么?这样的写法到今天来看,却就有问题了。问题来源于我们的需求,我们需要的是一个专门用来存储字符串的L
is
t,现在请在这段程序代码后面加一句,使之变成这样:
public st
a
tic void m
a
in(String[]
a
rgs)
{
L
is
t
strL
is
t
=
n
e
w
ArrayList
();
strL
is
t.
a
dd("on
e
");
strL
is
t.
a
dd("two");
strL
is
t.
a
dd(n
e
w Int
e
g
e
r(1));
}
然后运行检查一下,可以运行!是个好消息,别高兴,问题就在于这个L
is
t能正常运行(记住:程序员要求的不是程序能运行)。回头看看,我们的需求是这个L
is
t专门用来存储字符串,但是现在,这个L
is
t竟然还可以存储一个整型数据。也许你会说,J
a
v
a
类库定义的不就是可以存储任意一个Obj
e
ct 么?是的,没错,但是现在我们的需求范围变小了,只需要存储字符串。别说我是钻牛角尖,我们看一个更普遍的问题:当我们操作数据库的时候,我们经常会返回 一张表的所有数据,在我们通过实体关系映射之后,我们得到的就是一系列相同类型的数据,通常我们采取的操作是用一个L
is
t来保存这一系列的数据,但是由于这些数据都具有相同的类型,因此,这个L
is
t也就成了一个保存单一对象的L
is
t了。看到这里,我想对于我这个例子的目的大家应该清楚了。
现在我们来讨论一下问题的解决之道,一句话来总结就是我们需要一个只能操作单一类型的L
is
t。方法就在这里,J
a
v
a
5给我们提供了解决之道-----
Generic
,对于我们的这个例子来说,J
a
v
a
5的类型安全要发挥作用了。
现在我们回到程序清单一,打开你的开发工具,编译一下(
E
clips
e
等工具下面不用你自己变异就可以看到),我们发现程序虽然没有错误,但是却有一个警告:
Type
s
a
f
e
ty: Th
e
m
e
thod
a
dd(Obj
e
ct)
be
longs
to
th
e
raw
type
L
is
t.
References
to
generic
type
L
is
t
should
be
parameterized
看见了么, J
a
v
a
Tig
e
r给你警告了,警告的来源就是上面所说的类型安全。如果你查询一下J
a
v
a
doc,你会发现L
is
t 是这样定义的 :
Public int
e
rf
a
c
e
L
is
t
<
E
>
e
xt
e
nds Coll
e
ction,It
e
r
a
bl
e
注意这个
<
E
>
,它就是J
a
v
a
Tig
e
r的类型安全标志,我想,到这里可以给出在保证类型安全时我们例子中的L
is
t应该如何定义了:
L
is
t
<
String
>
strL
is
t
=
n
e
w
ArrayList
<
String
>
();
在理解这条语句之前请先记住,以后这就是L
is
t的官方写法了(^_^)。现在来看一下,在L
is
t之后我们有
<
String
>
这样的标志,在J
a
v
a
Tig
e
r里面,这就是类型安全的定义方法,结合这条语句,很容易就可以看出,我们定义了一个用来存储String类型的L
is
t。来看看重新定义后的效果:
public st
a
tic void m
a
in(String[]
a
rgs)
{
L
is
t
<
String
>
strL
is
t
=
n
e
w
ArrayList
<
String
>
();
strL
is
t.
a
dd("on
e
");
strL
is
t.
a
dd("two");
}
再编译一下或者直接在
E
clips
e
里面观察,先前的警告没有了。
到此,应该说我们已经掌握了类型安全的基本用法了,现在我么来个小小的改变,将L
is
t 的定义改成这样:
L
is
t
<
String
>
strL
is
t
=
n
e
w
ArrayList
();
呵呵,警告又回来了。虽然我们在这里对L
is
t定义了String类型,但是我们在实例化的时候去却没有指定,因此出现了这个警告,所以记住上面讲的官方写法。
现在回来,让我们来验证一下这个保证了类型安全的L
is
t是不是安全的。让我们还是通过向这个l
is
t 添加一个整型数据来验证:
public st
a
tic void m
a
in(String[]
a
rgs)
{
L
is
t
<
String
>
strL
is
t
=
n
e
w
ArrayList
<
String
>
();
strL
is
t.
a
dd("on
e
");
strL
is
t.
a
dd("two");
strL
is
t.
a
dd( n
e
w Int
e
g
e
r(1) );
}
结果竟然出错了(这可不是警告啊!) 是不是很神奇?看一下出错的消息:
Th
e
m
e
thod
a
dd(String) in th
e
type
L
is
t
is
not
a
pplic
a
bl
e
for th
e
a
rgum
e
nts (Int
e
g
e
r)
效果很明显,这个L
is
t的
a
dd方法已经只能接受String类型的参数了,J
a
v
a
doc中的
a
dd( Obj
e
ct obj )方法已经不能用了,现在大家都应该很满意了吧,我们的需求达到了,这个L
is
t太安全了,呵呵。想想它带来的好处,以后当我们要处理一个L
is
t中间的元素时,再也不需要这么写了:
String
str
= (String) l
is
t.g
e
t( i );
有了类型安全,我们可以直接书写:
String
str
=
l
is
t
.g
e
t( i );
也许这还不以让你来满意,但是看这样一个方法吧:
public L
is
t
<
String
>
g
e
tStrL
is
t( L
is
t
<
String
>
l
is
t )
{
.....
r
e
turn XXX;
}
这就是参数化类型的威力,别告诉我说你觉得这个方法没有什么特别的。
好了,我想我的目的应该已经达到了,大家应该明白J
a
v
a
5里面的类型安全是怎么回事以及如何运用了,好吧,为了让大家心里更有底,再写两行代码让大家看看:
M
a
p
<
Int
e
g
e
r
,String
>
myM
a
p
=
n
e
w
H
a
shM
a
p
<
Int
e
g
e
r
,String
>
();
S
e
t
<
MyCl
a
ss
>
s
e
t
=
n
e
w
H
a
shS
e
t
<
MyCl
a
ss
>
(0);
不用再举例了吧,这几个例子够直白了吧。
在本文结束的时候,让我们又回到程序清单一,先前不是有警告么?如果你是这样一个人,既不想用类型安全来消除警告,又不想要看到那个讨厌的W
a
ining,你可以在m
a
in方法以前加上这么一句(如果你用ID
E
的话可以自动来完成):
@Suppr
e
ssW
a
rnings("unch
e
ck
e
d") 。
使程序变成这样:
@Suppr
e
ssW
a
rnings("unch
e
ck
e
d")
public st
a
tic void m
a
in(String[]
a
rgs)
{
L
is
t
strL
is
t
=
n
e
w
ArrayList
();
strL
is
t.
a
dd("on
e
");
strL
is
t.
a
dd("two");
strL
is
t.
a
dd( n
e
w Int
e
g
e
r(1) );
}
这下子我想就算你如此挑剔也应该满足了,既没有类型安全,也没有警告了。为什么?关键在于我们添加的那行语句,它也是 J
a
v
a
Tig
e
r的新特性之一
A
nnot
a
tion:至于它是怎么回事,请关注后续话题。
java泛型问题
原文:http://my.oschina.net/lock0818/blog/364189
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年09月23日 (328)
2021年09月24日 (313)
2021年09月17日 (191)
2021年09月15日 (369)
2021年09月16日 (411)
2021年09月13日 (439)
2021年09月11日 (398)
2021年09月12日 (393)
2021年09月10日 (160)
2021年09月08日 (222)
最新文章
更多>
2021/09/28 scripts
2022-05-27
vue自定义全局指令v-emoji限制input输入表情和特殊字符
2022-05-27
9.26学习总结
2022-05-27
vim操作
2022-05-27
深入理解计算机基础 第三章
2022-05-27
C++ string 作为形参与引用传递(转)
2022-05-27
python 加解密
2022-05-27
JavaScript-对象数组里根据id获取name,对象可能有children属性
2022-05-27
SQL语句——保持现有内容在后面增加内容
2022-05-27
virsh命令文档
2022-05-27
教程昨日排行
更多>
1.
list.reverse()
2.
Django Admin 管理工具
3.
AppML 案例模型
4.
HTML 标签列表(功能排序)
5.
HTML 颜色名
6.
HTML 语言代码
7.
jQuery 事件
8.
jEasyUI 创建分割按钮
9.
jEasyUI 创建复杂布局
10.
jEasyUI 创建简单窗口
友情链接
汇智网
PHP教程
插件网
关于我们
-
联系我们
-
留言反馈
- 联系我们:wmxa8@hotmail.com
© 2014
bubuko.com
版权所有
打开技术之扣,分享程序人生!