假设我有:
class Bounded[A] {
type apply[C <: A] = C
}
Run Code Online (Sandbox Code Playgroud)
这编译:
implicitly[Bounded[Any]#apply[String] =:= String]
Run Code Online (Sandbox Code Playgroud)
这失败了:
type Str = Bounded[Any]#apply[String]
Run Code Online (Sandbox Code Playgroud)
...有:
[error] /home/grant/Workspace/scunits/test/src/main/scala/Box.scala:37: type arguments[String] do not conform to type apply's type parameter bounds [C <: A]
[error] type Str = Bounded[Any]#apply[String]
[error] ^
Run Code Online (Sandbox Code Playgroud)
我尝试使用抽象类型而不是类型参数,结果相同.我发现的唯一解决方法是实例化类型.这编译:
val boundedAny = new Bounded[Any]
type Str2 = boundedAny.apply[String]
Run Code Online (Sandbox Code Playgroud)
不幸的是,我正在使用没有运行时实例的幻像类型,通常是出于性能原因.
为什么Scala会在这里产生编译错误?有更好的解决方法吗?
谢谢你的帮助.
更新:除了下面的解决方法,我需要一种方法来覆盖具有抽象类型边界的类型.我是这样做的:
object Test {
class AbstractBounded[A] {
type apply[C <: A] <: A
class Workaround[C <: A] {
type go = apply[C] …Run Code Online (Sandbox Code Playgroud) 我有一个Scala应用程序,它一次维护(或尝试)到各种服务器的TCP连接数小时(可能> 24).每个服务器发送一个约30个字符的短消息,大约每秒两次.这些消息被送入迭代器,在那里它们被解析并最终最终对数据库进行状态更改.
如果这些连接中的任何一个因任何原因而失败,我的应用程序需要不断尝试重新连接,直到我另行指定.丢失的任何消息都是Bad.我无法控制我连接的服务器或使用的协议.
可以想象,一次可以有多达300个这样的连接.不是一个高负荷的情况,所以我不认为需要NIO,虽然它可能很好吗?该应用程序的其他位是高负载.
我正在寻找某种插座控制器/管理器,它可以尽可能可靠地保持这些连接.我现在正在运行自己的阻塞控制器,但由于我对套接字编码(以及所有各种设置,选项,超时等)缺乏经验,我怀疑它将实现最佳的正常运行时间.此外,我可能需要在某些时候支持SSL.
NIO会提供任何真正的优势吗?
Netty会是最好的选择吗?我在这里看过Uptime示例,并且只是想复制它,但是对于低级网络的新手,我不确定是否有更好的选择.