一段小代码的疑惑

lmuren265 2010-06-18 07:44:29
是一个方法,是打扑克时候的发牌,从一个list(整副牌)的最后取得一定数量的牌,用另一个list返回.代码来自java教程(第4版).
public static <E> List<E> dealhand(list<E> deck,int n){这一行第一个 <E> 为什么要加?List<E>不是已经表示返回
int decksize = deck.size();             类型了么. 那么他不显得多余? 
list<E>handview =deck.sublist(decksize-n,decksize);
list<E>hand =new Arraylist<E> (handview);
handView.clear(); handview 不是局部变量么,不是会自己释放内存么,为什么还要clear()?
return hand;
}

新手问题,前辈们帮帮忙
...全文
142 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lmuren265 2010-06-20
  • 打赏
  • 举报
回复
知道了,谢谢了
lmuren265 2010-06-19
  • 打赏
  • 举报
回复
[code=Java][/public static void main(String args[]){
List<String> a=new ArrayList<String>();
for(String s:args)
a.add(s);
List<String> b= dealhand(a,5);
}]
lmuren265 2010-06-19
  • 打赏
  • 举报
回复
理解了,大概就是第一个<E>就是用来指定整个方法里的所有其他的<E>的,因为是static类上的泛型参数完全用不到,需要单独在这个方法里指定list中<E>的类型,感觉是这样的..

public static void main(String args[]){
List<String> a=new ArrayList<String>();
for(String s:args)
a.add(s);
List<String> b= dealhand(a,5);
}
这个是我试用handview的main方法, List<String> b= dealhand(a,5); 编译器没提示错误,这里dealhand怎么指定他的<E>的,调用时也没有用像<String>dealhand(a,5)这样的格式,好像默认就知道了<E>全部是string,为什么呢?
焙焙龙 2010-06-19
  • 打赏
  • 举报
回复
根据你给的参数决定的
nokia_e72 2010-06-18
  • 打赏
  • 举报
回复
路过~~学习中~~~
焙焙龙 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lmuren265 的回复:]
就是说handoview的释放不会释放handview集合的元素.在handview释放前用clear比handview释放后再去出去他的元素方便对么.
关于<E>.返回类型声明 List<E> 不是已经 已经有个<E>来表示list里的元素是什么了么,不理解...
[/Quote]
因为你的方法是静态的,所以无法享受到类上面的泛型参数,故要是方法申明时返回值之前给定泛型参数,而返回值和参数中所用的泛型参数,则是它指定的,你可以把参数里面List的泛型参数改成别的字母看看,编译会不会过
Ade子夜 2010-06-18
  • 打赏
  • 举报
回复
顶!!!!
lmuren265 2010-06-18
  • 打赏
  • 举报
回复
龙叔,受教了.
lmuren265 2010-06-18
  • 打赏
  • 举报
回复
就是说handoview的释放不会释放handview集合的元素.在handview释放前用clear比handview释放后再去出去他的元素方便对么.
关于<E>.返回类型声明 List<E> 不是已经 已经有个<E>来表示list里的元素是什么了么,不理解...
焙焙龙 2010-06-18
  • 打赏
  • 举报
回复
第一个E表示了返回值List里面的元素是什么,E的值来源于方法申明
handView的确是局部变量,方法结束后引用会被销毁,但对象何时销毁并不知道,而里面的元素也可能论为垃圾,但是集合对象持有了集合元素的引用,故要等到集合对象销毁之后才轮到元素销毁,效率会有影像,而clear之后先把元素的引用释放了,集合引用销毁后集合对象和元素对象可以同一批次得到销毁,如果元素不在别的对方被引用的话
sportq 2010-06-18
  • 打赏
  • 举报
回复
技术分怎么转可用分
my5sky 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lmuren265 的回复:]
方法返回的是hand, handview被当作参数用,等到方法结束的时候handview不就没用了么,书上还是clear()了,我不明白他的用意.

上面的<E>的问题也一并回答下,谢谢啦
[/Quote]

是将原来那个集合里的元素清空啊
lmuren265 2010-06-18
  • 打赏
  • 举报
回复
方法返回的是hand, handview被当作参数用,等到方法结束的时候handview不就没用了么,书上还是clear()了,我不明白他的用意.

上面的<E>的问题也一并回答下,谢谢啦
my5sky 2010-06-18
  • 打赏
  • 举报
回复
handView.clear(); //handview 不是局部变量么,不是会自己释放内存么,为什么还要clear()?
不是释放内存,你定义的handView是一个List类型的,你看看java的API,在List集合中有一个方法是clear(),从列表中移除所有元素(可选操作)。此调用返回后列表将是空的(除非它抛出异常)。
lmuren265 2010-06-18
  • 打赏
  • 举报
回复
楼上的,非常感谢!
xx314327475 2010-06-18
  • 打赏
  • 举报
回复
我解决不了 坐等高人吧

我把代码排版下,没缩进的真难看

public static <E> List<E> dealhand(list<E> deck,int n){ //第一个<E>的原因
int decksize = deck.size();            
list<E>handview =deck.sublist(decksize-n,decksize);
list<E>hand =new Arraylist<E> (handview);
handView.clear(); //handview 不是局部变量么,不是会自己释放内存么,为什么还要clear()?
return hand;
}

xx314327475 2010-06-18
  • 打赏
  • 举报
回复
哥们麻烦你排下版 我头都看晕了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧