2016-02-25 3 views
0

мне было интересно, о разнице между использованием абстрактного класса и интерфейса, и это озадачило меня немного:Java Аннотация Класс объявляет throwable - реализация не обеспечивает его соблюдение?

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

public abstract class Animal { 
//return the tail lenght of the animal 
public abstract int getTailLength() throws IllegalStateException; 
} 

, который обещает, что реализации абстрактного класса есть метод называемые getTailLength() [компилятор заставляет расширить классы @Override абстрактный класс и реализовать их] так:

public Snake extends Animal(){ 

@override 
public int getTailLength(){ 
    return 10; 
} 
} 

компилятор хорошо с этим еще в абстрактном классе, когда мы объявляем, что хотим реализовать getTailLenght(), мы также упоминаем, что мы хотим, чтобы он выдавал исключение, но в приведенном выше фрагменте, который был опущен.

Я прав, думая, что это запрещено, когда вы делаете то же самое с интерфейсом и декларацией «реализует»?

Я полагаю, что, поскольку вы комментируете метод с помощью @override, компилятору просто все равно, что вы делаете, если у вас есть метод, который имеет имя, которое вы применяете в ADT? Он проверяет тип возвращаемого значения, почему он не применяет исключение?

ответ

0

Мы не хотим, чтобы метод выдавал исключение все время (иначе мы никогда не получим значимого результата), мы говорим «этот метод МОЖЕТ бросить это исключение». Совершенно нормально, если подклассы не выбрасывают исключение, если это не имеет смысла.

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

Также прекрасно не объявлять предложение throw в своей реализации, чтобы реализовать метод интерфейса, объявляющий предложение throw.

+0

Есть ли смысл заявлять, что абстрактный метод может вызвать исключение? Кажется избыточным, если его можно просто игнорировать или специфично для реализации. Хотя, если договор абстрактного метода ясно показывает, что есть предварительное условие, может быть приятно отметить, что реализации должны вызывать исключение – Runecreed