- Да.
Из-за сильного ввода текста он не позволяет «печатать по типу», поскольку я понимаю, что он используется на языке C. Тем не менее, у вас есть субтипирование, поэтому вы можете безопасно использовать значение типа A
, где запрашивается значение типа B
, если A <: B
(A
является подтипом или более конкретно, чем B
).
Вы можете принуждать типа с использованием a.asInstanceOf[B]
, однако это будет типа проверено во время выполнения и вызывает исключение быть выброшен, если a
не подтип B
, за исключением высших kinded типов, которые стираются на JVM, что означает, что такое исключение может быть выбрано только позже, когда будут указаны фактические значения параметров типа.
Другое исключением является структурного типирование которые можно были бы рассматривать как «каламбуры», хотя типобезопасный:
// ordinary type
trait Foo {
def bar: Int
}
// structural type
type Bar = Any {
def bar: Int
}
def test(b: Bar) = b.bar
test(new Foo { val bar = 1234 }) // allowed
Это считается продвинутой функцией, которая редко используется, и даже может быть устаревшим в будущие версии Scala. Это требует отражения времени выполнения и, следовательно, имеет штраф за производительность.
Вы также можете отказаться от системы статического типа, используя специальный Dynamic
trait. Или вы можете сделать сумасшедшие вещи using macros, чтобы реализовать свой собственный кастинг.
Идея не эксперт ML. Но если политик просто означает this, тогда это выглядит как обычные более высокоприоритетные (параметризованные) типы или «generics», и ответ будет Да.
- Пример: функция тождества:
def identity[A](x: A): A = x
- Пример: один параметр типа:
trait Option[+A] { def get: A }
вы в конечном итоге в осиное гнездо здесь, потому что * слабый * или * сильный * типирования (говорит Википедия)] (https://en.wikipedia.org/wiki/Strong_and_weak_typing);) – Carsten
На этот вопрос нельзя ответить, пока вы не дадите точное определение «строго типизировано». –