Generics Scala:两个不同类、相同方法的实例
这是一个微不足道的问题,我只是想知道我是否可以在这里使用一些鳞片。我有两个不同的类(Generics Scala:两个不同类、相同方法的实例,generics,scala,Generics,Scala,这是一个微不足道的问题,我只是想知道我是否可以在这里使用一些鳞片。我有两个不同的类(Server1和Server2),它们都实现了一个公共接口/特性(使用方法.a()和.B()) 这显然混淆了编译器: var server = null if(cond) server=new Server1 else server=new Server2 server.A() //or server.B() 我主要好奇的是,我是否可以使用Scala的选项来巧妙地解决这个问题。谢谢。始终可以添加类型批注: va
Server1
和Server2
),它们都实现了一个公共接口/特性(使用方法.a()
和.B()
)
这显然混淆了编译器:
var server = null
if(cond) server=new Server1 else server=new Server2
server.A() //or server.B()
我主要好奇的是,我是否可以使用Scala的选项来巧妙地解决这个问题。谢谢。始终可以添加类型批注:
var server: TraitOrInterface = null
然而,由于变量有点讨厌
val server = if (cond) {
new Server1()
} else {
new Server2()
}
在第二个示例中,Scala应该能够统一类型。(我相当肯定,在某些情况下它无法统一——或者它没有完全按照预期统一,但在返回到类型注释之前,请尝试一下,可以按照第一个示例添加类型注释。)
REPL演示:
class X
trait Y
class A extends X with Y {}
class B extends X with Y {}
val uni = if (true) new A() else new B()
uni
>> res3: X with Y = A@17b8cf0
快乐编码
结构类型示例,
类型
别名是为了方便,但在技术上不是必需的
class Cat { def speak() = "meow" }
class Dog { def speak() = "woof" }
type ThingThatSpeaks = { def speak(): String }
val speaker : ThingThatSpeaks = if (true /* smart */) new Cat() else new Dog()
speaker
>> res4: ThingThatSpeaks = Cat@2893fc
speaker.speak()
>> res5: String = meow
请注意,类型批注是必需的,否则
val speaker = if (true /* smart */) new Cat() else new Dog()
speaker
>> res6: ScalaObject = Cat@f0ac6e
speaker.speak()
>> error: value speak is not a member of ScalaObject
始终可以添加类型批注:
var server: TraitOrInterface = null
然而,由于变量有点讨厌
val server = if (cond) {
new Server1()
} else {
new Server2()
}
在第二个示例中,Scala应该能够统一类型。(我相当肯定,在某些情况下它无法统一——或者它没有完全按照预期统一,但在返回到类型注释之前,请尝试一下,可以按照第一个示例添加类型注释。)
REPL演示:
class X
trait Y
class A extends X with Y {}
class B extends X with Y {}
val uni = if (true) new A() else new B()
uni
>> res3: X with Y = A@17b8cf0
快乐编码
结构类型示例,
类型
别名是为了方便,但在技术上不是必需的
class Cat { def speak() = "meow" }
class Dog { def speak() = "woof" }
type ThingThatSpeaks = { def speak(): String }
val speaker : ThingThatSpeaks = if (true /* smart */) new Cat() else new Dog()
speaker
>> res4: ThingThatSpeaks = Cat@2893fc
speaker.speak()
>> res5: String = meow
请注意,类型批注是必需的,否则
val speaker = if (true /* smart */) new Cat() else new Dog()
speaker
>> res6: ScalaObject = Cat@f0ac6e
speaker.speak()
>> error: value speak is not a member of ScalaObject
不是
选项
,而是选项
:
var server = if (cond) Right(new Server1) else Left(new Server2)
server match {
case Right(srv) => srv.A()
case Left(srv) => srv.B()
}
不是
选项
,而是选项
:
var server = if (cond) Right(new Server1) else Left(new Server2)
server match {
case Right(srv) => srv.A()
case Left(srv) => srv.B()
}
如果这不是一个共同的特征,但顺便说一句,是相同的方法名呢?(是的,那是废话-但以防万一)@parsa那么你可以使用:-)@parsa我添加了一个使用结构类型的示例。如果这不是一个常见的特征,但顺便说一句,是相同的方法名呢?(是的,那是废话-但以防万一)@parsa那么你可以使用:-)@parsa我添加了一个使用结构类型的示例。