Так что я немного запутался в функции подтипирования. У меня есть следующее, с которым я возился. Я знаю, что для контравариантности A-> Int является подтипом B-> Int, поэтому я смог присвоить AToInt «testBContra».Функция подтипирования и Scala - confused
Но то, что я думал, что я мог сделать, это передать Объект на «testBContra» ...
testBContra (а)
, который не работает. Неужели я не понимаю, что можно передать? Я подумал, что теперь могу передать объект A и вернуть ему Int.
class S(x: Int) {
val sInput = x
}
class A(x: Int) extends S(x){
val aInput = x
}
class B(x: Int) extends A(x){
val bInput = x
}
def AToInt(h: A): Int = h.aInput
// Checking contravariance
// val testSContra: S=>Int = AtoInt
val testAContra: A=>Int = AToInt
val testBContra: B=>Int = AToInt
val a = new A(2)
val b = new B(5)
val s = new S(10)
testAContra(b)
testBContra(b)
Также это помогает посмотреть, что может сделать 'testBContra'. Скажем, это был «val testBContra: B => Int = _.bInput'. Тогда, очевидно, система типов не была звуковой, если она позволила вам передать значение 'a' типа' A', потому что 'a' не имеет метода' bInput'. –
Спасибо, ребята. Извините, если я плотно об этом. Может быть, я просто написал плохой пример для работы, но как тогда я могу передать что-то для проверкиBContra, которая была бы A => Int?Функция ожидает объект, поэтому, когда я пытаюсь передать ему функцию, она возвращает ошибку – cpd1
@ cpd1 - Почему вы назначаете функцию 'A => Int' переменной типа B = Int и затем пытаетесь вызвать это с экземпляром 'A'? Не можете ли вы просто назвать это напрямую? Не могли бы вы добавить больше подробностей к своему вопросу, чтобы показать, зачем вам это нужно? – Lee