浏览 7001 次
锁定老帖子 主题:Java 泛型警告
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-12
系统框架:一棵"命令"树,一棵"数据"树,命令树的根,即顶端元素是一个抽象类或接口,对外提供一个 execute 方法,但是这个方法的返回类型会因为命令的不同而不同,在这里举两个个实例,以学生选课来说。 命令一、学生选的课的列表 GetMyCourseCommand 命令的 execute() 方法应返回一个 List。 命令二、是不是选了某一个课程 CourseIsSelectedCommand 命令的 execute() 方法返回一个 Boolean。 这样的话,我的接口会定义成: public interface Comamnd<T>{ public T execute(); } 由于我不想让客户端知道自己到底调用了哪一个命令,于是写一个工厂来生产 Command,由于是工厂,所以 getCommand() 方法将被设置成 static 的,很简单,我犯不着每次想得到一个 Command 都创建一个 Factory 对象。 这样,客户端要做的,就是根据需求创建不同的 Data 对象,并将 data 对象传入工厂方法,刚才提及的 getCommand() 的完整定义是 public static Command getCommand(Data d); 至此,客户端在处理上述例子时对应应该做的就是: 例子一、 Data d = new GetMyCourseData(params...); Command<List> cmd = CommandFactory.getCommand(d); List<Course> list = cmd.execute(); 例子二、 Data d = new CourseIsSelectedData(params...); Command<Boolean> cmd = CommandFactory.getCommand(d); boolean isSelected = cmd.execute(); 客户端好像挺清晰的,但是 Java 的泛型却提示了警告,在中间那行生产Command对象的代码那。 试过N多方法,除了 new 一个工厂对象出来,并将 getCommand 改为成员方法外,都无法消除这个警告。当然,我也不确定这个做法是不是有点设计过度 :-( 这个警告能消除吗? <怎么预览的时候代码多个几个?> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-12
JavaVision 写道 把泛型语法多看看.
java的"泛型" 是静态的, 只要带到new方面的,应该都不行的. 那为什么 Collection<T> col = new ArrayList<K,V>() 是可以的 |
|
返回顶楼 | |
发表时间:2007-04-12
因为Factory在Compile期间不能保证出来的Command能Match Command<List>所以是Warning.
|
|
返回顶楼 | |
发表时间:2007-04-12
看来此题无解只能加 unchecked 了
|
|
返回顶楼 | |
发表时间:2007-04-17
今天把书看了一下,此题是有解的。上次在写这个代码的时候因时间关系没好好看书,不应该呀不应该。 解决方法如下: public static <T> Command<T> getCommand(Data d); 调用方法如前。 |
|
返回顶楼 | |
发表时间:2007-04-17
我也问一下,有一个这样的方法:
public List toList(String[] strArray){ return Arrays.asList(strArray); } 然后通过如下方式调用: List<String> list = (List<String>)toList(new String[5]); 为什么总有告警,能消除吗? |
|
返回顶楼 | |
发表时间:2007-04-17
List<String> list = toList(new String[5]);
public List<String> toList(String[] strArray) { return Arrays.asList(strArray); } idea里自动转换的 |
|
返回顶楼 | |
发表时间:2007-04-17
ls
public List<String> toList(String[] strArray){ return Arrays.asList(strArray); } 方法返回类型声明范型,List<T>赋值给同类型变量就不会有强制转换的警告了 |
|
返回顶楼 | |
发表时间:2007-04-17
jfy3d 写道 List<String> list = toList(new String[5]);
public List<String> toList(String[] strArray) { return Arrays.asList(strArray); } idea里自动转换的 呵呵,谢谢,我也突然想明白 |
|
返回顶楼 | |
发表时间:2007-04-17
hbcui1984 写道 我也问一下,有一个这样的方法:
public List toList(String[] strArray){ return Arrays.asList(strArray); } 然后通过如下方式调用: List<String> list = (List<String>)toList(new String[5]); 为什么总有告警,能消除吗? public <T> List<T> toList(T[] array){ return Arrays.asList(array); } |
|
返回顶楼 | |