Проблема в возвращении интерфейса в качестве типа возврата в Java - PullRequest
1 голос
/ 15 февраля 2011

У меня есть следующий код:


Filename: A.java

package test1

public interface A {
   int get();
   int set();
}

Filename: B.java

package test1
public class B implements A {

    int get() {
       ...
    }

    int set() {
     ....
    }
}

Filename: C.java

package test2

import test1.A;
import test1.B;

publc class C {

        public A getNum() {
             B test = null;

             return(test);
        }
}

Когда я скомпилировал приведенный выше код в Eclipse -> Пример проекта Java, он работает нормально,Но когда я скомпилировал тот же код в Android, он выдает следующую ошибку: Метод C.getNum возвращает недоступный тип A;

Пожалуйста, дайте мне знать, где я ошибаюсь.

Заранее спасибо, Кранти

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Предполагая, что A.java, B.java находятся в тестовой директории, а C.java находится в корневой директории, в приведенном выше коде много проблеми "реализует"

методы интерфейса общедоступны, даже если они не объявлены.Таким образом, при реализации в B оба, get и set должны быть общедоступными A.java и B.java должны иметь пакетный тест;в качестве первой строки необходимо импортировать test.A;import test.B; Нет объявления класса для C B test = 0;неправильно.Это должно быть либо B test = null;или B test = new B ();в зависимости от того, что вы планируете использовать.0 является целым числом и не может быть приведено к B , возвращение B недопустимо, так как B является именем класса.Вы, вероятно, намеревались вернуть тест;

Вот модифицированный код

A.java

package test;
public interface A {
    int get();
    int set();
}

B.java

package test;
public class B implements A {

    public int get() {
        return 0;
    }

    public int set() {
        return 0;
    }
}

C.java

import test.A;
import test.B;

public class C {
    public A getNum() {
        B test = new B();

        return test;
    }
}
1 голос
/ 15 февраля 2011

Inteface и Implements не являются ключевыми словами Java.Вы должны использовать interface и implements вместо этого.Java чувствительна к регистру.Тип A недоступен в пути к классам из-за других ошибок компиляции.

должен работать следующий код:

public class Test {
    interface  A {
        int get();
        int set();
    }

    class B implements A {

        @Override
        public int get() {
            return 0;
        }

        @Override
        public int set() {
            return 0;
        }
    }

    class C {
        public A getNum(){
            A a = new B();
            return a; 
        }
    }
}

Я создал этот код на основе вашего примера.Но вы знаете, я не могу себе представить, для чего этот код полезен.

0 голосов
/ 15 февраля 2011

Проблема, которую я вижу, состоит в том, чтобы просто упомянуть объявление пакета, т. Е. Пакет test1, в файле интерфейса А.

...