2013-04-21 2 views
-4

Это почти то же самое, что и заданный вопрос here.«A не может быть суперинтерфейсом B; суперинтерфейс должен быть интерфейсом «

Но моя проблема расширяет это.

Я могу изменить его на «A extends B», но тогда я должен сделать свои методы нестатичными и просто завинтить всю мою систему.

Есть ли способ исправить это?

Хорошо, скажем, у меня есть класс А с методом А. А. и метод BB

public class A { 

    public static final BB(){ 

    } 
    public static final AA(){ 

    } 
    } 
} 

Вот набор теперь у меня есть еще один класс, который реализует его, но он также имеет свою собственную версию метода AA и BB.

public class AImpl implements A { 

    public BB(){ 

    } 
    public AA(){ 

    } 
    } 
} 

теперь, если я пытаюсь расширить класс я получаю ошибку «метод экземпляра не может переопределить статический метод из А».

Так то говорит, что я могу это исправить, удалив статический из класса А.

я что то мне подсказывает, что почти все другие, может быть, 50 классы не могут ссылаться на нестатический метод из метод класса А BB.

+1

Не могли бы вы опубликовать то, что вы на самом деле пытаетесь сделать, желательно с кодом? – Antimony

+0

В примере, который вы указали, ваш первый раздел «кода» - это класс. Второй раздел пытается его реализовать. Классы могут расширять классы, но они могут реализовывать только интерфейсы. – jschabs

ответ

6

interface s не может быть static методов. Они могут иметь константы static final, но не методы.

Если вы хотите иметь static методы, которые вы должны использовать abstract class

interface Iface { 
    void doStuff();   
} 

abstract class Base implements Iface { 
    static void doStaticStuff() { 

    } 
} 

EDIT

Вы не можете переопределить static методы. Вы также не можете implement других классов.

Вы extend Другие классы.

Вы не можете решить проблему, если вы либо сделать методы в одном классе, не static или сделать методы в другом классе static

static class A { 
    static void a(){} 
} 

static class B extends A { 
    static void a(){} 
} 

То, что вы пытаетесь сделать, не имеет никакого смысла. Как метод экземпляра переопределяет метод static?

Уведомление это не переопределить метод a() в A он просто создает еще один a() метод в B. Вызов A.a() вызовет метод a() в A, а класс B.a() вызовет метод a() в B.

Это не имеет смысла иметь методы static, которые называются одними и теми же в двух разных классах, поскольку это вызывает проблемы со статическим импортом и создает впечатление, что метод в одном классе переопределяет другой. Что это не так.

В любом случае, даже если вы смогли переопределить static методов; ваш тоже final, что делает невозможным. Даже если вы удалите static, вы не сможете переопределить методы, пока не удалите final.

Смежные вопросы