2015-08-15 5 views
1

Является ли компилятор Clojure для проверки того, что запись или тип, который говорит, что он создает протокол, фактически реализует перечисленные в нем методы?Компилятор Clojure проверяет, реализуют ли протоколы и типы протоколы?

Я пробую это сейчас и до сих пор, похоже, это не так.

+1

Я считаю, что за кулисами 'defprotocol' генерирует интерфейс Java. можете ли вы поделиться своим кодом? – lispHK01

+0

@ lispHK01 javac устанавливает, что методы интерфейса реализованы, но сам vm этого не делает. Можно легко реализовать интерфейс в Clojure без реализации всех его методов. – noisesmith

+0

@noisesmith ах интересно! хорошо знать – lispHK01

ответ

1

запись может реализовать протокол без реализации какой-либо из его методов:

(defprotocol Structure 
    (weight [this]) 
    (balanced? [this])) 

(defrecord Mobile [] 
    Structure 
) 

... принят.

Если вы попытаетесь использовать несуществующий метод:

(balanced? (Mobile.)) 

;java.lang.AbstractMethodError: user.Mobile.balanced_QMARK_()Ljava/lang/Object; 

Как обычно, ошибки типа встречаются во время выполнения.

+1

Знаете ли вы о каких-либо инструментах, которые делают проверку времени компиляции? Я не большой поклонник статического контроля типов. Но проверяя, что что-то, что утверждает, что реализует интерфейс, действительно реализует его, было бы полезно. – interstar

+1

@interstar Я не знаю такого инструмента. Возможно, последующий вопрос? – Thumbnail

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