我纯粹是出于娱乐目的而编写以下代码,可能仍然存在错误,或者甚至根本不起作用:

public class PrimeGenerator implements PrimitiveIterator.OfInt {
    private final static IntNode HEAD_NODE = new IntNode(2); //error here

    private IntNode lastNode = HEAD_NODE;
    private int current = 0;

    @Override
    public boolean hasNext() {
        return true;
    }
    @Override
    public int nextInt() {
        if (lastNode.value == current) {
            lastNode = lastNode.next;
            return lastNode.value;
        }
        while (true) {
            current++;
            if (isPrime(current)) {
                break;
            }
        }
        appendNode(current);
        return current;
    }

    private boolean isPrime(final int number) {
        PrimeGenerator primeGenerator = new PrimeGenerator();
        int prime = 0;
        while (prime < number) {
            prime = primeGenerator.nextInt();
            if (number % prime == 0) {
                return false;
            }
        }
        return true;
    }

    private void appendNode(final int value) {
        couple(lastNode, new IntNode(value));
    }

    private void couple(final IntNode first, final IntNode second) {
        first.next = second;
        second.previous = first;
    }

    private class IntNode {
        public final int value;

        public IntNode previous;
        public IntNode next;

        public IntNode(final int value) {
            this.value = value;
        }
    }
}


对于不熟悉Java 8的人们,不用担心,PrimitiveIterator.OfIntIterator<Integer>的工作原理相同。

我遇到的问题在第二行,即:

private final static IntNode HEAD_NODE = new IntNode(2);


我得到警告:non-static variable this cannot be referenced from a static class

我已经搜索过,应该可以通过使IntNode不依赖于PrimeGenerator并通过将其移到其自己的公共类中来进行修复。

但是,如果我不想公开IntNode,该怎么办?

最佳答案

您应该将您的IntNode类设置为static

如果不这样做,这意味着IntNode实例在不存在封闭类的实例的情况下将不存在。

简而言之,您不能写(当然,前提是IntNodepublic):

new PrimeGenerator.IntNode(whatever);


但是您必须创建一个新的PrimeGenerator,在下面说generator并输入:

generator.new IntNode(whatever);


但是,您在这里尝试创建IntNode作为PrimeGenerator的类变量。这将不起作用,因为您还没有PrimeGenerator实例。

10-08 06:23