Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Scala:两个不同类、相同方法的实例_Generics_Scala - Fatal编程技术网

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我添加了一个使用结构类型的示例。