я мог придумать с кодировками (удален параметрами типа для упрощения):
scala> :paste
// Entering paste mode (ctrl-D to finish)
def test0(a: A)(t : a.T) = a.test(t)
abstract class B{
val a: A
val t: a.T
def test = a.test(t)
}
// Exiting paste mode, now interpreting.
test0: (a: A)(t: a.T)Unit
defined class B
этого с другой стороны, не работал с тематическими классами аргументами (ни классами по этому вопросу).
Одна из причин, ваша кодировка не будет работать:
scala> def test1(a: A)(t : A#T) = a.test(t)
<console>:12: error: type mismatch;
found : t.type (with underlying type A#T)
required: a.T
def test1(a: A)(t : A#T) = a.test(t)
Важной частью является required: a.T
(по сравнению с A#T
). Метод испытания в A
не принимает каких-либо Т, оно принимает Т this.T
, или, другими словами, Т, принадлежащих к одному конкретному экземпляру А.
Но 'B [A2] (новый A3()," ")' не компилируется, хотя ... вы имели в виду, что это будет с моим кодом? Иначе ваше решение именно то, что мне нужно. – JbGi
Ха, умный трюк! Я не знал, что можно использовать параметр типа на правом прицеле в уточнении. – Haspemulator
@JbGi Да, я много думал о том, как продемонстрировать это с помощью собственно компиляционного примера, но scala-компилятор здесь довольно ограничительный. Так что пусть это просто воображаемый пример для воображаемого scala-подобного компилятора, который мог бы скомпилировать исходный исходный код – Odomontois