class Queue[+T](
private val leading: List[T],
private val trailing: List[T]
) {
def append[U >: T](x: U) =
new Queue[U](leading, x :: trailing) // ...
}
class Fruit
class oranges extends Fruit
class apple extends Fruit
class diffAppale
val q1: Queue[Fruit] = new Queue[apple](List(new apple), List())
//> q1 : Test.Queue[Test.Fruit] = [email protected]
q1.append(new Fruit)
//> res0: Test.Queue[Test.Fruit] = [email protected]
q1.append(new oranges)
//> res1: Test.Queue[Test.Fruit] = [email protected]
q1.append(new diffAppale) // i want to restrict this
//> res2: Test.Queue[Object] = [email protected]
Здесь я мог бы добавить, чтобы добавить функцию, что когда-либо объект, я могу, я могу видеть, полученный тип понижен к наименьшему общему знаменателюСкала нижняя и верхняя границы
Но я хотел бы иметь такое же поведение как java, скажем def append [? super T] (x: U) // здесь функция append будет принимать все объекты, которые являются супертипами T, Как я могу достичь аналогичного в scala (реализовать супер и расширить для дженериков, таких как java)
Почему эта проблема для вас? –
Я хочу добавить некоторые конкретные типы объектов только через функцию append, которая может управляться с помощью:: <: .. Это допустимо? –
Я думаю, вы пытаетесь думать более сложным, что нужно. Если ваш требуемый тип возврата в конкретном случае - 'Queue [Fruit]', он в любом случае не позволит вам возвращать 'Queue [Any]'. В большинстве случаев нецелесообразно принудительно вводить дополнительные ограничения типа искусственно, когда программа корректно проверяет тип. В любом случае, как я предлагаю в ответ, если вы действительно этого хотите, просто удалите дисперсию. –