Структурные типы в скале - PullRequest
0 голосов
/ 08 ноября 2018

Если у меня есть такой класс

class CanFlyType[T <: {type thing <: Bird}](t : T) {
  def flySpeed() = {
    println(t)
  }
}

Что вы можете передать конструктору для создания этого класса? Я пытался передать это

class Species
class Animal extends Species
class Tiger extends Animal
abstract class Bird (name : String) extends Species {
  val birdName = name
  val flySpeed : Int
}

class Sparrow(name : String) extends Bird(name) {
  val flySpeed = 30
}


val sparrow : Bird1 = new Sparrow("Robbin")

val canFly = new CanFlyType(sparrow)

Но я получаю ошибку. Я знаю, что мы можем достичь этого другими способами, но я просто хочу знать, можете ли вы использовать тип структурным типом и разницу между вышеприведенным и

class CanFly1[T <: Bird1](bird : T) {
  def flySpeed() = {
    println(bird.flySpeed)
  }
}

1 Ответ

0 голосов
/ 08 ноября 2018

Когда вы указываете [T <: {type thing <: Bird}], вы указываете компилятору искать тип с элементом типа с именем вещь, который сам должен быть подклассом Bird.

Следующее исправляет проблему:

class Species
class Animal extends Species
class Tiger extends Animal
abstract class Bird (name : String) extends Species {
  val birdName = name
  val flySpeed : Int
}

class Sparrow(name : String) extends Bird(name) {
  type thing = this.type
  val flySpeed = 30
}


val sparrow : Sparrow = new Sparrow("Robbin")

val canFly = new CanFlyType(sparrow)

class CanFlyType[T <: {type thing <: Bird}](t : T) {
  def flySpeed() = {
    println(t)
  }
}

Обратите внимание, что, вероятно, НЕ , что вы хотите сделать на практике. Вы, вероятно, хотите просто ограничить свой CanFlyType[T <: Bird].

...