小编oxb*_*kes的帖子

关于Java和Scala中的泛型

我对通用子类型感到困惑.

在Java中,如果type AB泛型类型的子类型C<A>并且C<B>是不变的.例如,ArrayList<Base>不是子类型ArrayList<Derived>.

但是,在Scala中,泛型类型C<A>,C<B>如果type A是子类型,则是协变的B.那么Scala中泛型类的属性是什么,而Java中却没有?

generics scala subtyping

15
推荐指数
1
解决办法
4975
查看次数

手码GUI或使用gui-designer工具

我想听到一些关于手工编写GUI的意见,就像使用Java或Qt和C++一样,使用gui设计工具?GUI设计器工具的示例是MFC GUI设计器,Qt设计器,Interface Builder(Apple).

我曾经是手工编码的粉丝,但从最近的经验我已经切换.我用手编码看到的问题是编写GUI非常快速和灵活,但是一旦你需要对很久以前编写的GUI进行更改,这可能会非常困难.在大面板中找到正确的元素可能很困难.

第二个问题是它很容易在GUI创建和布局代码中添加大量逻辑.我经常不得不接管维护很难重用的GUI代码,因为它的行为与它的外观混合在一起,混合布局和行为通常使得这个类非常庞大且难以理解.

在我看来,使用GUI设计器工具可以在外观和逻辑之间实现更清晰的分离.

c++ java swing gui-designer windows-forms-designer

14
推荐指数
3
解决办法
5389
查看次数

Spring的依赖注入是否会破坏信息隐藏?

来自C++背景我必须掌握Java世界及其框架的复杂性.看一下DI的弹簧框架,我发现我很难相信我必须制作每个将受DI公众影响的setter功能.这种要求是否违反了信息隐藏原则?

当然我希望spring能够设置我的类的一些私有部分,但我当然不希望每个客户端类都能够做同样的事情.

我在这里错过了什么?

java spring encapsulation dependency-injection

14
推荐指数
3
解决办法
1798
查看次数

什么是/ tmp等效的最佳窗口?

我想改进java应用程序的跨平台行为.但是,它的测试套件目前假定存在该/tmp目录.

Windows平台上最好的等效位置是什么?NB我绝对不想假设用户拥有管理员权限,但我确实希望它至少可以在XP,Vista和Windows7上运行.

是否存在可以提供帮助的现有环境变量,和/或我可以按优先顺序尝试的一组首选位置?

java unix windows

14
推荐指数
2
解决办法
4936
查看次数

在scala 2.8中从String到Int的隐式转换

以下片段是否有问题: -

object Imp {
  implicit def string2Int(s: String): Int = s.toInt

  def f(i: Int) = i

  def main(args: Array[String]) {
    val n: Int = f("666")
  }
}
Run Code Online (Sandbox Code Playgroud)

我从2.8编译器中得到以下内容: -

信息:编译完成时出现1错误和0警告
信息:1错误
信息:0警告
...\scala-2.8-tests\src\Imp.scala
错误:错误:第(4)行错误:类型不匹配;
found:
需要字符串:?{val toInt:?}
请注意,隐式转换不适用,因为它们不明确:
对象Imp中的方法string2Int类型(s:String)Int
和对象Prementf中的方法augmentString类型(x:String) scala.collection.immutable.StringOps
是可能的转换函数从String到?{val toInt:?}
隐式def string2Int(s:String):Int = s.toInt

scala scala-2.8

14
推荐指数
2
解决办法
3万
查看次数

函数等价于if(p(f(a),f(b))a else b

我猜测必须有更好的功能方式来表达以下内容:

def foo(i: Any) : Int

if (foo(a) < foo(b)) a else b 
Run Code Online (Sandbox Code Playgroud)

所以在这个例子f == foop == _ < _.对于scalaz来说,必然会有一些熟练的聪明才智!我可以看到使用BooleanW我可以写:

p(f(a), f(b)).option(a).getOrElse(b)
Run Code Online (Sandbox Code Playgroud)

但我确信我能够编写一些只引用ab一次的代码.如果这存在,它必须是某种组合Function1W和其他东西,但scalaz对我来说有点神秘!

编辑:我想我在这里问的不是"我怎么写这个?" 但是"这个功能的正确名称和签名是什么?它与FP的东西有什么关系,我还不知道像Kleisli,Comonad等?"

functional-programming scala scalaz

14
推荐指数
2
解决办法
1028
查看次数

撰写Scalaz验证

我想使用Scalaz进行验证,并希望能够在不同的上下文中重用验证函数.我对Scalaz btw完全不熟悉.

假设我有这些简单的检查:

def checkDefined(xs: Option[String]): Validation[String, String] =
  xs.map(_.success).getOrElse("empty".fail)

def nonEmpty(str: String): Validation[String, String] =
  if (str.nonEmpty) str.success else "empty".fail

def int(str: String): Validation[String, Int] = ...
Run Code Online (Sandbox Code Playgroud)

我希望能够组合验证,其中一个的输出被馈送到另一个.我可以很容易地用flatMap或通过理解,但感觉必须有一个更好的方式.

for {
  v1 <- checkDefined(map.get("foo"))
  v2 <- nonEmpty(v1)
  v3 <- int(v2)
  v4 <- ...
} yield SomeCaseClass(v3, v4)
Run Code Online (Sandbox Code Playgroud)

要么

val x1 = checkDefined(map get "foo").flatMap(nonEmpty).flatMap(int)
val x2 = check(...)

// How to combine x1 and x2?
Run Code Online (Sandbox Code Playgroud)

那里的Scalaz专家有什么想法吗?

scala scalaz

14
推荐指数
2
解决办法
4304
查看次数

避免使用镜头重复,同时深入复制到Map值

我有一个不可变的数据结构,我在地图中有嵌套值,如下所示:

case class TradingDay(syms: Map[String, SymDay] = Map.empty)
case class SymDay(sym: String, traders: Map[String, TraderSymDay] = Map.empty)
case class TraderSymDay(trader: String, sym: String, trades: List[Trade] = Nil)
Run Code Online (Sandbox Code Playgroud)

另外,我有一天中所有交易的清单,我想生成TradingDay结构,在哪里

case class Trade(sym: String, trader: String, qty: Int)
Run Code Online (Sandbox Code Playgroud)

我想通过折叠我的交易来弄清楚如何用镜头更新这个结构(见附录):

(TradingDay() /: trades) { (trd, d) =>
  def sym = trd.sym
  def trader = trd.trader
  import TradingDay._
  import SymDay._
  import TraderSymDay._
  val mod =
    for {
      _ <- (Syms member sym).mods(
             _ orElse some(SymDay(sym)))
      _ <- (Syms at sym andThen Traders …
Run Code Online (Sandbox Code Playgroud)

scala scalaz lenses

14
推荐指数
2
解决办法
963
查看次数

这个案例类匹配模式是如何工作的?

我刚刚在Scala actors包中看到过这个case类:

case class ! [a](ch: Channel[a], msg: a)
Run Code Online (Sandbox Code Playgroud)

在JavaDoc中,它以下列形式描述了用法:

receive {
  case Chan1 ! msg1 => ...
  case Chan2 ! msg2 => ...
}
Run Code Online (Sandbox Code Playgroud)

为什么不是这样的:

receive {
  case !(Chan1, msg1) => ...
  case !(Chan2, msg2) => ...
}
Run Code Online (Sandbox Code Playgroud)

是砰的操作员!与以冒号结尾的方法类似的特殊情况:

scala pattern-matching case-class

13
推荐指数
1
解决办法
1684
查看次数

将Scala varargs转换为Java Object ... varargs

我有一个Java类,它记录的东西有这样的方法:

void info(Object message, Object... params);
Run Code Online (Sandbox Code Playgroud)

在Scala中,我创建了一个围绕这样调用的包装器,如下所示:

def info(msg: => String, params: Any*) {
  log.info(msg, params);
}
Run Code Online (Sandbox Code Playgroud)

我打电话的时候:

val host = "127.0.0.1"
val port = "1234"
info("Start on {0}:{1}", host, port)
Run Code Online (Sandbox Code Playgroud)

我明白了:

"Started on WrappedArray(127.0.0.1, 1234):{1}"
Run Code Online (Sandbox Code Playgroud)

现在,有没有人现在如何将params转换为可以正确使用的Object []?

我试着这样做:

def info(msg: => String, params: Any*)
  log.info(msg, params.toList.toArray);
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

"Started on [Ljava.lang.Object;@14a18d:{1}"
Run Code Online (Sandbox Code Playgroud)

你做的时候会发生类似的事情:

params.asInstanceOf[WrappedArray[Object]].array
Run Code Online (Sandbox Code Playgroud)

scala scala-2.8

13
推荐指数
2
解决办法
2980
查看次数