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 [?超级T](X:U)//此处附加功能将它们是T形的超类型的所有对象,我怎么能实现类似一个在斯卡拉(实现超和扩展对于像Java泛型)
为什么这是你的问题吗? –
我想添加一些特定的对象类型只能通过追加功能,这可以通过>:,<:..控制它是否易于? –
我认为你正试图想要更复杂的需要。如果您在特定情况下需要的返回类型是Queue [Fruit],它总是不允许您返回Queue [Any]。大多数情况下,当程序正确地进行类型检查时,人为地强制实施其他类型限制是没有意义的。无论如何,正如我在答案中所建议的那样,如果你真的想要这样做,只需删除差异。 –