小编Gra*_*ant的帖子

Scala:使用类型参数或抽象类型作为类型边界

假设我有:

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)

types scala type-bounds phantom-types

8
推荐指数
1
解决办法
163
查看次数

需要可靠/持久的出站套接字,选项?

我有一个Scala应用程序,它一次维护(或尝试)到各种服务器的TCP连接数小时(可能> 24).每个服务器发送一个约30个字符的短消息,大约每秒两次.这些消息被送入迭代器,在那里它们被解析并最终最终对数据库进行状态更改.

如果这些连接中的任何一个因任何原因而失败,我的应用程序需要不断尝试重新连接,直到我另行指定.丢失的任何消息都是Bad.我无法控制我连接的服务器或使用的协议.

可以想象,一次可以有多达300个这样的连接.不是一个高负荷的情况,所以我不认为需要NIO,虽然它可能很好吗?该应用程序的其他位是高负载.

我正在寻找某种插座控制器/管理器,它可以尽可能可靠地保持这些连接.我现在正在运行自己的阻塞控制器,但由于我对套接字编码(以及所有各种设置,选项,超时等)缺乏经验,我怀疑它将实现最佳的正常运行时间.此外,我可能需要在某些时候支持SSL.

NIO会提供任何真正的优势吗?

Netty会是最好的选择吗?我在这里看过Uptime示例,并且只是想复制它,但是对于低级网络的新手,我不确定是否有更好的选择.

java sockets nio scala netty

6
推荐指数
1
解决办法
399
查看次数

标签 统计

scala ×2

java ×1

netty ×1

nio ×1

phantom-types ×1

sockets ×1

type-bounds ×1

types ×1