关于以Set集合为第二参数的foreach(第一参数:第二参数)

来源:5-4 学生选课---修改 Map 中的学生

慕粉2304285705

2016-12-28 00:05


foreach结构中(第一参数:第二参数),第二参数应该为第一参数的数组,例如第一参数为int时,第二参数为int[];第一参数为float时,第二参数为float[];我看到课程中老师写到for(Entry:Set),for(String:Set)这样两种不同的结构,因此我想问问Set的类型是随着其元素的类型的不同而不同的吗?例如元素为String类型,那么Set为String数组,元素为Entry类型,那么Set为Entry数组,是这样吗?

写回答 关注

3回答

  • 慕无忌7020780
    2016-12-28 11:13:39
    已采纳

    大体意思应该是这样的。 set是集合不是数组。我在 想可不可以for(Set:Set) 有一个 Set集合里面装的是不同的Set集合。

    慕粉2304...

    非常感谢!

    2016-12-28 17:23:44

    共 1 条回复 >

  • SteelIU
    2017-01-05 11:33:57

    更准确的说法是: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()是迭代器。

  • KingOneWang
    2016-12-28 11:08:11

    是这样的。循环出来的类型要和循环的类型基本保持一致。

Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409792 学习 · 4340 问题

查看课程

相似问题