【问题标题】:Inner class object as Outer class constructor argument内部类对象作为外部类构造函数参数
【发布时间】:2013-05-31 09:41:23
【问题描述】:

我有一个抽象包装类 Foo,它通过提供接口阅读器来定义功能。当我实现一个单独的阅读器并提供它时,一切都很好。 当我试图通过内部类来做到这一点时,它会出错。在内部类中实现 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());
    }
}

我做错了什么?

【问题讨论】:

    标签: java class interface


    【解决方案1】:

    尝试制作FooReaderstatic。 Java 中的内部类绑定到外部的 instance 而不是 class,除非它们是 static

    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 关键字的意义何在?
    • new MapLink.MapReader() 被编译器隐式转换为新的MapLink.MapReader(MapLink.this)(如果MapReader 是内部类),而MapLink.this 尚不可用。
    • @JamieFlowers 你能告诉我们一些MapLinkMapReader的代码吗?
    • 抱歉,复制粘贴错误。我的意思是 super(new ReaderFoo.FooReader());
    • 您知道我在哪里可以阅读有关此隐式转换的更多信息吗?使用 new 关键字通常标记新对象的创建不是很直观。
    【解决方案2】:

    问题是FooReader 的构造函数需要在它之前实例化外部类(ReaderFoo)(因为内部类存储对其包含实例的引用),但您正在 构造函数ReaderFoo。这是一个先有鸡还是先有蛋的问题。

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多