求教Java编程思想里面的一题,怎么也找不到错误在哪!

privilege1900 2013-01-08 08:59:05
这是书上第11章持有对象里面的练习31题
(3)修改RandomShapeGenerator.java,使其成为一个Iterable。
这是LZ写的代码:

public class RandomShapeIterable implements Iterator<Shape> {
private Random rand = new Random(27);
private final int generateShapeNum;
public RandomShapeIterable( int generateShapeNum ) {
this.generateShapeNum = generateShapeNum;
}

public Iterator<Shape> iterator() {
return new Iterator<Shape>() {
private int num = 0;
public boolean hasNext() {
return num < generateShapeNum;
}
public Shape next() {
num++;
switch(rand.nextInt(3)) {
default:
case 0: return new Circle();
case 1: return new Square();
case 2: return new Triangle();
}
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args) {
for (Shape s : new RandomShapeIterable(10)) {
s.draw();
s.erase();
}
}

}


报错如下:


在下面是答案上的代码
class RandomShapeGenerator implements Iterable<Shape> {
private Random rand = new Random(47);
private final int quantity;

RandomShapeGenerator(int quantity) {
this.quantity = quantity;
}

public Iterator<Shape> iterator() {
return new Iterator<Shape>() {
private int count;

public boolean hasNext() {
return count < quantity;
}

public Shape next() {
++count;
return nextShape();
}

public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}

private Shape nextShape() {
switch (rand.nextInt(3)) {
default:
case 0:
return new Circle();
case 1:
return new Square();
case 2:
return new Triangle();
}
}
}

public class E31_IterableRandomShapeGenerator {
public static void main(String[] args) {
RandomShapeGenerator rsg = new RandomShapeGenerator(10);
for (Shape shape : rsg)
System.out.println(shape.getClass().getSimpleName());
}
}


好吧,撸主不明白的地方有两处:
一、为什么实现Iterable接口的类不用在类中实现hasNext()、next()、remove()的定义,
然而在内部类里实现后却能够运行?
二、撸主检查了一遍又一遍实在是找不到自己写的代码到底哪里出了错,我感觉明明就跟答案里的一样啊?
跪求大神指点啊!!!
...全文
156 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
privilege1900 2013-01-09
  • 打赏
  • 举报
回复
引用 5 楼 nmyangym 的回复:
按楼主的代码,用内部类实现一个跌代器,不需要实现那个接口了,代码就不会报那几个错误。 但输出的时候,因为没有实现Iterable接口,不可用foreach()循环,楼主可以自己改一下代码试试。
谢谢大神啊,怪自己昏过头了,这么明显的错误居然都没发现。。。
nmyangym 2013-01-08
  • 打赏
  • 举报
回复
按楼主的代码,用内部类实现一个跌代器,不需要实现那个接口了,代码就不会报那几个错误。 但输出的时候,因为没有实现Iterable接口,不可用foreach()循环,楼主可以自己改一下代码试试。
nmyangym 2013-01-08
  • 打赏
  • 举报
回复
Iterable 接口就一个方法,返回一个实现了Iterator接口的类的对象。如果类本身实现了Iterator接口,那么这个类的实例本身是一个Iterator. 刚把代码改了一下,测试正常。

import java.util.*;
import static tij.util.Print.*;//静态引入,环境不同要变。
public class RandomShapeIterable implements Iterator<Shape>
{
	private Random rand = new Random(27);
	private final int generateShapeNum;
	public RandomShapeIterable( int generateShapeNum )
	{
		this.generateShapeNum = generateShapeNum;
	}
  
	private int num = 0;
	public boolean hasNext() 
	{
		return num < generateShapeNum;
	}
	public Shape next() 
	{
		num++;
		switch(rand.nextInt(3)) 
		{
			default:
			case 0: return new Circle();
			case 1: return new Square();
			case 2: return new Triangle();
		}
	}
	public void remove() 
	{
		throw new UnsupportedOperationException();
	}
	
	public static void main(String[] args) 
	{
		RandomShapeIterable rsi=new RandomShapeIterable(10);
		Shape s=null;
		while(rsi.hasNext())
		{
			s=rsi.next();
			s.draw();
			s.erase();
		}
	}
}
class Shape 
{
	public void draw() {}
	public void erase() {}
}
class Circle extends Shape 
{
	public void draw() { print("Circle.draw()"); }
	public void erase() { print("Circle.erase()"); }
}
class Square extends Shape 
{
	public void draw() { print("Square.draw()"); }
	public void erase() { print("Square.erase()"); }
}
class Triangle extends Shape 
{
	public void draw() { print("Triangle.draw()"); }
	public void erase() { print("Triangle.erase()"); }
}
privilege1900 2013-01-08
  • 打赏
  • 举报
回复
引用 1 楼 nmyangym 的回复:
楼主和答案实现的接口不同。 答案是java.lang.Iterable,而楼主java.util.Iterator. 答案实现了那个接口的唯一的方法,而楼主没有实现那个接口的3个方法。
感谢啊,原来是这个问题!不过大神能回答我一下第一个问题么,为什么在类中没有 定义那三个方法,而在内部类定义却可以运行呢?按理说Iterable这个接口也需要实现三个方法啊
nmyangym 2013-01-08
  • 打赏
  • 举报
回复
楼主把接口Iterator改成Iterable就ok!
nmyangym 2013-01-08
  • 打赏
  • 举报
回复
楼主和答案实现的接口不同。 答案是java.lang.Iterable,而楼主java.util.Iterator. 答案实现了那个接口的唯一的方法,而楼主没有实现那个接口的3个方法。

62,614

社区成员

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

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