如果我有这样的课程
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)
}
}
答案 0 :(得分:5)
当您指定[T <: {type thing <: Bird}]
时,是在告诉编译器寻找具有 type成员的类型,该成员称为Thing,它本身必须是Bird
的子类。 / p>
以下内容解决了该问题:
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]
。