2014-02-21 8 views
-2

Вопрос 2: Что не так в следующем интерфейсе?Метод по умолчанию в java 8

public interface SomethingIsWrong { 
    void aMethod(int aValue) { 
     System.out.println("Hi Mom"); 
    } 
} 

Ответ 2: Она имеет реализацию метода в нем. Только стандартные и статические методы имеют реализации (я ДУМАЮ, ЭТО НЕПРАВИЛЬНО, ЧТО ИНТЕРФЕЙС НЕ МОЖЕТ ИСПОЛЬЗОВАТЬ МЕТОДЫ С ТЕЧЕНИЕМ ПОТЕНЦИАЛА ПО УМОЛЧАНИЮ, ЕГО МЕТОДЫ АБСТРАКТЫ).

Вопрос 3: Фикс интерфейс в вопросе 2.

Ответ 3:

public interface SomethingIsWrong { 
    void aMethod(int aValue); 
} 

В качестве альтернативы, вы можете определить aMethod как метод по умолчанию:

public interface SomethingIsWrong { 
    default void aMethod(int aValue) { 
     System.out.println("Hi Mom"); 
    } 
} 

Я нашел это в docs.oracle.com, и мне интересно, что это правильные ответы, которые дает O RACLE? по-моему.

1. В ответе 2 написано, что только стандартные и статические методы имеют реализации?

2.В ответ на альтернативу 3 это означает, что метод aMethod может быть определен как метод по умолчанию, но интерфейс не может иметь тело тела в нем, потому что по умолчанию методы в интерфейсе являются абстрактными, мы можем реализовать его метод только в своем подклассе.

Пожалуйста, дайте мне знать, ORACLE сайт прав или не так?

+1

дайте ссылку .. – swapnil7

+2

ПОЖАЛУЙСТА, НЕ БЫВАЙТЕ НА США. –

+0

Если это того стоит, [это похоже на соответствующую страницу Oracle] (http://docs.oracle.com/javase/tutorial/java/IandI/QandE/interfaces-answers.html). – PakkuDon

ответ

11

Страница, на которую вы смотрите, о скоро появляющейся Java 8, где интерфейсы могут иметь методы «по умолчанию», содержащие реализацию, а также могут иметь статические методы.

До Java 8 методы интерфейса не могут иметь тело, а интерфейсы не могут иметь статические методы.

+3

О, фантастично, поэтому нам больше не нужны занятия! Означает ли это многократное наследование? Проблема наследования алмазов? Yeeha! –

+0

Нет проблемы с алмазами. См. Http://www.lambdafaq.org/what-about-the-diamond-problem/. И классы по-прежнему очень нужны. Методы по умолчанию не могут быть окончательными. Интерфейсы по-прежнему не могут иметь состояние и конструкторы. –

+0

Эта страница не удовлетворяет меня тем, что проблема с алмазом отсутствует. Что, если (в примере), методы с идентичными сигнатурами, но разные реализации были в 'B' и' C'? Невозможно определить, какой из них «D» наследует. –

2

Метод по умолчанию будет введен в java 8, который также известен как Защитные методы.

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

public interface Foo { 
    default void fun(){ 
     System.out.println("Calling Foo.fun()"); 
    } 
} 

public interface Bar { 
    default void fun(){ 
     System.out.println("Calling Bar.fun()"); 
    } 
} 


public class FooBar implements Foo, Bar { 
} 

В этом случае он будет производить компилировать error-

java: class FooBar inherits unrelated defaults for fun() from types Foo and Bar 

В этом случае класс FooBar будет вынужден отменить конфликтующие метод fun .so правильной реализации будет

public class FooBar implements Foo, Bar { 
    public void fun(){...} 
} 
+3

+1 для «наследует несвязанные значения по умолчанию для удовольствия». Что бы класс был, если бы он не имел никакого удовольствия? –

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