论坛首页 Java企业应用论坛

Java 泛型警告

浏览 6989 次
精华帖 (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 改为成员方法外,都无法消除这个警告。当然,我也不确定这个做法是不是有点设计过度 :-(

这个警告能消除吗?


<怎么预览的时候代码多个几个?>
   发表时间:2007-04-12  
JavaVision 写道
把泛型语法多看看.

java的"泛型" 是静态的, 只要带到new方面的,应该都不行的.



那为什么 Collection<T> col = new ArrayList<K,V>() 是可以的
0 请登录后投票
   发表时间:2007-04-12  
因为Factory在Compile期间不能保证出来的Command能Match Command<List>所以是Warning.
0 请登录后投票
   发表时间:2007-04-12  
看来此题无解只能加 unchecked 了
0 请登录后投票
   发表时间:2007-04-17  

今天把书看了一下,此题是有解的。上次在写这个代码的时候因时间关系没好好看书,不应该呀不应该。
解决方法如下:
public static <T> Command<T> getCommand(Data d);

调用方法如前。
0 请登录后投票
   发表时间:2007-04-17  
我也问一下,有一个这样的方法:
	public List toList(String[] strArray){
		return Arrays.asList(strArray);
	}

然后通过如下方式调用:
List<String> list = (List<String>)toList(new String[5]);

为什么总有告警,能消除吗?
0 请登录后投票
   发表时间:2007-04-17  
List<String> list = toList(new String[5]);

    public List<String> toList(String[] strArray) {
        return Arrays.asList(strArray);
    }

idea里自动转换的
0 请登录后投票
   发表时间:2007-04-17  
ls
public List<String> toList(String[] strArray){  
    return Arrays.asList(strArray);  


方法返回类型声明范型,List<T>赋值给同类型变量就不会有强制转换的警告了
0 请登录后投票
   发表时间:2007-04-17  
jfy3d 写道
List<String> list = toList(new String[5]);

    public List<String> toList(String[] strArray) {
        return Arrays.asList(strArray);
    }

idea里自动转换的

呵呵,谢谢,我也突然想明白
0 请登录后投票
   发表时间: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);
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics