Несколько нижних границ типа в Scala

Я заметил, что tuple.productIterator всегда возвращает Iterator [Any] , и поинтересовался, нельзя ли установить несколько нижних границ (так что это может быть Iterator самого низкого общего супертипа).

Я пробовал и немного искал, но нашел только этот вопрос для нескольких верхних границ.

Это мой тест на то, как определить тип итератор:

def f[A,B](a:A, b:B) = List(a,b)
// return type is List[Any]

def f[A,B, T >: A "and" T >: B](a:A, b:B) = List[T](a,b)
// doesn't compile, but
//  f(1, true) should give a List[AnyVal] and
//  f("x", "y") a List[String]

Это ограничение JVM?


Изменить:

productIterator всегда возвращает Iterator [Any] и задается вопросом, нельзя ли установить несколько нижних границ (чтобы это мог быть Iterator самого низкого общего супертипа). Я ...

Я заметил, что tuple.productIterator всегда возвращает Iterator [Any] , и поинтересовался, нельзя ли установить несколько нижних границ (так что это может быть Iterator самого низкого общего супертипа).

Я пробовал и немного искал, но нашел только этот вопрос для нескольких верхних границ.

Это мой тест на то, как определить тип итератор:

def f[A,B](a:A, b:B) = List(a,b)
// return type is List[Any]

def f[A,B, T >: A "and" T >: B](a:A, b:B) = List[T](a,b)
// doesn't compile, but
//  f(1, true) should give a List[AnyVal] and
//  f("x", "y") a List[String]

Это ограничение JVM?


Изменить:

productIterator всегда возвращает Iterator [Any] и задается вопросом, нельзя ли установить несколько нижних границ (чтобы это мог быть Iterator самого низкого общего супертипа). Я ...

Я заметил, что tuple.productIterator всегда возвращает Iterator [Any] , и поинтересовался, нельзя ли установить несколько нижних границ (так что это может быть Iterator самого низкого общего супертипа).

Я пробовал и немного искал, но нашел только этот вопрос для нескольких верхних границ.

Это мой тест на то, как определить тип итератор:

def f[A,B](a:A, b:B) = List(a,b)
// return type is List[Any]

def f[A,B, T >: A "and" T >: B](a:A, b:B) = List[T](a,b)
// doesn't compile, but
//  f(1, true) should give a List[AnyVal] and
//  f("x", "y") a List[String]

Это ограничение JVM?


Изменить:

Вот немного более крупный пример, который, похоже, не может быть решен с использованием подхода IttayD, когда T должно быть определено в методе:

class Foo[A, B](a: A, b: B) {
  def f[T >: A] = List[T](a) // works
  def g[T >: A "and" T >: B] = List[T](a) // doesn't work
}

12
задан Community 23 May 2017 в 11:44
поделиться