慕粉2304285705
2016-12-28 00:05
foreach结构中(第一参数:第二参数),第二参数应该为第一参数的数组,例如第一参数为int时,第二参数为int[];第一参数为float时,第二参数为float[];我看到课程中老师写到for(Entry:Set),for(String:Set)这样两种不同的结构,因此我想问问Set的类型是随着其元素的类型的不同而不同的吗?例如元素为String类型,那么Set为String数组,元素为Entry类型,那么Set为Entry数组,是这样吗?
大体意思应该是这样的。 set是集合不是数组。我在 想可不可以for(Set:Set) 有一个 Set集合里面装的是不同的Set集合。
更准确的说法是:Set中元素为String类型,那么引用parm1为String类型,Set中元素为Entry类型,那么引用parm1为Entry类型。而实际上引用parm1可以是Set中元素的父类型和实现的接口类型。
因为ForEach(parm1:parm2)本质上是迭代器。以使用迭代器遍历EntrySet为例
Set<Entry<String,String>>entrySet=studentMap.entrySet();
Entry<String,String>>iter=entrySet.iterator(); while(iter.hasnext()){ Entry<String,String>entry=iter.next();//迭代器中这一步可以对应foreach中--parm1:param2 //这里的entry是可以写成其父类型的,赋值时的向上造型 }
ForEach循环语句判断循环的条件是iter.hasnext(),
parm1(Entry<String,String>entry)是接受iter.next()对象的引用。parm1的类型可以是iter.next()对象的父类型或者实现的接口类型,但是由于泛型集合的约束和向上造型带来的多态性。 我们习惯把parm1和parm2中元素的类型保持一致。下面演示parm1是父类型,如下:
public class sonTest extends superTest{ public static void main(String[] args) { // TODO Auto-generated method stub Set<sonTest>sonSet=new HashSet<sonTest>(); for(int i=0;i<10;i++){ sonSet.add(new sonTest()); } for(superTest T:sonSet){ } //编译器没有报错,所以可以使用iter.next()对象的父类型或者实现的接口类型 } } class superTest {}
回答不易,没有积分也希望能多多支持。说了这么多,其实就一句,foreach()是迭代器。
是这样的。循环出来的类型要和循环的类型基本保持一致。
Java入门第三季
409792 学习 · 4340 问题
相似问题