//定义的接口
      public interface Generator{ Object next();}      //自己定义的Arrays2类,具体实现没有写出。
      public class Arrays2{
         public static void fill(Object[] a ,Generator gen){
            //具体实现
            //为a数组的每个元素填充内容不同的同类对象。
         }
      }      //需要考虑的程序
      public class CompType implements Comparable{
   int i;
int j;
public CompType(int n1,int n2){
i=n1;
j=n2;
} private static Random r = new Random(); public static Generator generator(){
return new Generator(){
public Object next(){
return new CompType(r.nextInt(100),r.nextInt(100));
}
}
}

public static void main( String[] args){
CompType[] a=new CompType[10];
                  
                  //generator()返回的是Generator对象,为什么可以填充到a中?
                  //a数组不是只能填充CompType对象吗?
Array2.fill(a,generator());
}
      }程序是出于TIJ的306页的数组比较的例子,有这书的朋友可以看看具体的程序。注:程序没有确定有没有语法错误,有的话希望大家忽略,直接讨论我在程序中提的问题。谢谢!

解决方案 »

  1.   

    不知道楼主是从哪里看出fill()方法是要把generator()返回的对象“填充到a中”的?TIJ的这个例子我看过,fill()方法不是要把Generator填充到数组a中,而是要调用Generator接口中的next()方法,并把next()产生的结果填充到a中。 而在generator()方法中,匿名的内部类实现了Generator中的next()方法,并返回一个随机数构成的CompType对象。因此,是next()产生的对象被填充到了a中,而不是Generator被填充到a中。
      

  2.   

    我仔细看了一下书
    1、//generator()返回的是Generator对象,为什么可以填充到a中?
    的确,但是生成的对象作为参数传递到fill方法中,在fill方法内部调用该对象的next方法实现初始化a。2、//a数组不是只能填充CompType对象吗?
    由于在fill方法中,数组已经向上转型为Object数组类型,则可以接受Generator对象中next方法的返回值。但是这种结构必须使Generator接口的实现和数组的类型一致,不然将产生潜在的错误。例如以下代码实现:public class Test1{
    public static void main(String[] args){
    Test1[] a = new Test1[3];
    Object t = new String("");
    fill(a,t);

    Test1 t1;

    for(int i = 0;i < a.length;i++){
    t1 = a[i];
    }
    }

    public static  void fill(Object[] a,Object b){
    a[0] = b;
    }
    }
      

  3.   

    昨晚发贴后,仔细看过,得到的答案跟信誉不好的Dan1980一样。呵呵。