内部类对象作为外部类构造函数的参数

4

我有一个抽象的包装类Foo,通过提供接口Reader来定义其功能。当我实现一个单独的Reader并提供它时,一切都很顺利。

但当我尝试使用内部类来完成这个操作时,就出了问题。对于我来说,在内部类中实现Reader是必需的。

public abstract class Foo
    {
        private Reader reader;

        public Foo(Reader reader)
        {
            this.reader = reader;
        }

        public void read()
        {
            this.reader.doit();
        }
    }

由于一些中间构造函数调用,MapLink类型的封闭实例不可用。

public class ReaderFoo extends Foo
{
    public class FooReader implements Reader
    {
        @Override
        public void doit()
        {
            // functionality
        }
    }   

    public ReaderFoo ()
    {
        super(new FooReader());
    }
}

我做错了什么?

2个回答

4
尝试将FooReader改为static。在Java中,内部类与外部实例绑定,而不是与类绑定,除非它们是静态的
public class ReaderFoo extends Foo
{
    public static class FooReader implements Reader
    {
        @Override
        public void doit()
        {
            // functionality
        }
    }   

    public ReaderFoo ()
    {
        super(new FooReader());
    }
}

在实例化内部类之前,您不能使用它,因为 Reader 的实际类型将会像 myInstance.Reader 一样。


你说得一般正确,但我想知道为什么我甚至不能使用super(new MapLink.MapReader())来完成它。那么public关键字的意义是什么呢? - John Frost
1
编译器会将new MapLink.MapReader()隐式转换为new MapLink.MapReader(MapLink.this)(如果MapReader是内部类),而此时MapLink.this尚不可用。 - Simon Nickerson
@JamieFlowers,你能给我们展示一下 MapLinkMapReader 的代码吗? - Matthias Meid
@JamieFlowers 正确的代码应该是 super(new ReaderFoo().new FooReader()); 用于非静态嵌套类。 正确 意味着在此处 编译不会出错,我更建议您使用静态类。 - Matthias Meid
@JamieFlowers:例如,可以查看Jon Skeet对https://dev59.com/13RB5IYBdhLWcg3wET1J的回答。我找不到JLS中的适当部分,但如果有帮助的话,我可以去寻找它。 - Simon Nickerson
显示剩余3条评论

3
问题在于构造函数FooReader要求在它之前实例化外部类(ReaderFoo)(因为内部类存储对其包含实例的引用),但你正在构造函数中创建一个ReaderFoo。这是一个鸡生蛋的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接