Задав этот вопрос, чтобы прояснить мое понимание классов типов и более высоких типов, я не ищу обходные пути в Java.
В Haskell я мог написать что-то вроде
class Negatable t where
negate :: t -> t
normalize :: (Negatable t) => t -> t
normalize x = negate (negate x)
Затем, предполагая, что у Bool
есть экземпляр Negatable
,
v :: Bool
v = normalize True
И все работает нормально.
В Java не представляется возможным объявить правильный Negatable
интерфейс. Мы могли бы написать:
interface Negatable {
Negatable negate();
}
Negatable normalize(Negatable a) {
a.negate().negate();
}
Но тогда, в отличие от Haskell, следующее не будет компилироваться без литья (предположим, что MyBoolean
реализует Negatable
):
MyBoolean val = normalize(new MyBoolean()); // does not compile; val is a Negatable, not a MyBoolean
Есть ли способ ссылаться на тип реализации в интерфейсе Java или это фундаментальное ограничение системы типа Java? Если это ограничение, связано ли это с поддержкой более высокого типа? Я думаю, что нет: похоже, это еще одно ограничение. Если да, то имеет ли это имя?
Спасибо, и, пожалуйста, дайте мне знать, если вопрос неясен!