Java 如何使用迭代器实现两个类的接口

Java 如何使用迭代器实现两个类的接口,java,Java,我正在试用java中的接口,我想用pop()和push()方法和迭代器为一个非常简单的堆栈实现一个公共接口 问题是我不知道如何在接口中指定迭代器。无论我用哪种方式尝试,我都会成功 Main.java:32: error: for-each not applicable to expression type for (Integer i : ss) ^ required: array or java.

我正在试用java中的接口,我想用
pop()
push()
方法和迭代器为一个非常简单的堆栈实现一个公共接口

问题是我不知道如何在接口中指定迭代器。无论我用哪种方式尝试,我都会成功

Main.java:32: error: for-each not applicable to expression type
                for (Integer i : ss)
                                 ^
required: array or java.lang.Iterable
found:    Stack<Integer>
Main.java:32:error:for-each不适用于表达式类型
for(整数i:ss)
^
必需:数组或java.lang.Iterable
找到:堆栈
代码如下:

interface Stack<T> {

    boolean push(T t);

    boolean pop();
    
    //Iterator<T> iterator(); // How to indicate it needs, and will have, an iterator?
}
接口堆栈{
布尔推(T);
布尔pop();
//迭代器迭代器();//如何指示它需要并且将拥有迭代器?
}
public类DynamicStack实现Iterable、Stack
{
//具体实现的变量在这里
公共DynamicStack(){
//...
}
公共布尔推送(T){
//...
}
公共布尔pop(){
//...
}
私有类StackIterator实现了迭代器{
动态堆栈stk;
//...
//迭代器构造函数
专用堆栈迭代器(DynamicStack stk)
{
//...
}
公共布尔hasNext()
{
//...
}
public T next()抛出NoTouchElementException
{
//...
}
public void remove()引发UnsupportedOperationException
{
抛出新的UnsupportedOperationException();//我选择不实现这个
}
}
//迭代器法
公共迭代器迭代器()
{
返回新的StackIterator(此);
}
}
public类statistack实现了Iterable,Stack
{
//具体实现的变量在这里
公共静态堆栈()
{
//...
}
公共布尔推送(T)
{
//...
}
公共布尔pop()
{
//...
}
私有类StackIterator实现了迭代器
{
静态堆栈stk;
//...
专用堆栈迭代器(StaticStack stk)
{
//...
}
公共布尔hasNext()
{
//...
}
public T next()抛出NoTouchElementException
{
//...
}
public void remove()引发UnsupportedOperationException
{
//...
}
}
//迭代器法
公共迭代器迭代器()
{
返回新的StackIterator(此);
}
}
Main在创建了每种类型的几个堆栈并添加了几个元素之后,就可以简单地执行此操作:

public static void showStuff(Stack<Integer> ss)
{
    for (Integer i : ss)
        System.out.print(i+" ");
    System.out.println();
}
publicstaticvoidshowtuff(堆栈ss)
{
for(整数i:ss)
系统输出打印(i+“”);
System.out.println();
}

您需要类来实现
Iterable
,该类具有
iterator()
方法,该方法返回
iterator

在测试类中,您正在对
堆栈
接口进行操作,因此该接口需要符合
Iterable
。在这种情况下,如果
StaticStack
DynamicStack
不起作用,则执行它是没有帮助的

要使堆栈能够用作Iterable,只需更改堆栈以扩展Iterable:

public interface Stack<T> extends Iterable<T> {    

    boolean push(T t);

    boolean pop();        
}
公共接口堆栈扩展了Iterable{
布尔推(T);
布尔pop();
}

公共类statistack实现堆栈
代码运行得很好:

public class Tester {
  public static void main(String args[]) {
    Stack<Integer> ss = new StaticStack<>();
    for (Integer i : ss)
        System.out.print(i+" ");
    System.out.println();
  }
}
公共类测试器{
公共静态void main(字符串参数[]){
Stack ss=新的StaticStack();
for(整数i:ss)
系统输出打印(i+“”);
System.out.println();
}
}

能否显示整个主类代码?看起来您正在定义类堆栈的ss变量,它没有实现iterable,因此fails@ruba事实上,ss属于Stack类。如果我在接口中执行
implements Iterable
,它会抱怨
类型的非法启动。我怎样才能做到这一点呢?如果要将类型放在接口上,请使用
extends
。如果将其放在类中,请使用
实现
。谢谢!成功了。我想理论是说栈是一个迭代的孩子,所有实现堆栈接口的人都必须实现可迭代的方法和推送和弹出的方法。@ LyTung如果你觉得这已经解决了你的问题,考虑接受答案(在上/下投票按钮下面的复选标记)@ LeTung,后者是真的,除了堆栈方法之外,所有实现堆栈的人还必须实现Iterable方法。关于作为一个孩子。。。嗯,它扩展了Iterable,继承了它的特性并添加了一些自己的特性。人们可以把它看作是亲子关系,但我自己不这么称呼他们。好的,谢谢!
public interface Stack<T> extends Iterable<T> {    

    boolean push(T t);

    boolean pop();        
}
public class StaticStack<T> implements Stack<T>
public class Tester {
  public static void main(String args[]) {
    Stack<Integer> ss = new StaticStack<>();
    for (Integer i : ss)
        System.out.print(i+" ");
    System.out.println();
  }
}