Передача внутреннего класса, который реализует интерфейс - PullRequest
1 голос
/ 16 июня 2011

Скажите, у меня есть следующее:

public class A {
  //stuff
  public class B implements I {}
}

public interface I {}

public class Foo {
  int bar(I i) {}
}

Теперь, почему Java выдает ошибку сборки «не применимо для типа ...», когда я пытаюсь передать экземпляр B в Foo.bar () внутри тела класса A?

Разве внутренний класс не считается надлежащей реализацией I, поскольку он содержится внутри класса верхнего уровня?

Ура, Дейв.

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

Я подозреваю, что у вас может быть два разных интерфейса I. Убедитесь, что вы импортируете одни и те же файлы в оба файла.

Это именно та ошибка, которую вы получаете (из Eclipse), если вы случайно используете два разных интерфейса с одним и тем же именем.

The method bar(I) in the type Foo is not applicable for the arguments (A.B)

Для справки, это прекрасно для меня:

class A {
    // stuff
    public void test() {
        new Foo().bar(new B());
    }

    public class B implements I {
    }
}

interface I {
}

class Foo {
    int bar(I i) {
        return 0;    // note that you need a return value for it to compile.
    }
}
2 голосов
/ 16 июня 2011

Вам необходим экземпляр класса A, прежде чем вы сможете создать экземпляр объекта B (потому что B является внутренним классом A). Попробуйте этот код:

Foo foo = new Foo();
A a = new A();
B b = a.new B();
foo.bar(b);
0 голосов
/ 16 июня 2011

В вашем коде B имеет неявную ссылку на A, поэтому вам нужен A (this внутри метода A, new A() вне контекста A) Если в вашем приложении B является I в пространстве имен A без фактического использования неявной ссылки между B и A, вы должны объявить внутренний класс static:

public class A {
  //stuff
  public static class B implements I {}
}

public interface I {}

public class Foo {
  int bar(I i) {}
}

Теперь должно работать следующее:

Foo foo = new Foo();
B b = new A.B();
foo.bar(b);
...