该sum方法的签名TraversableOnce如下:
def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)
Run Code Online (Sandbox Code Playgroud)
我可以这样使用它:
scala> (1 to 10).sum
res0: Int = 55
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器会注入Numeric[B]自身,因此在范围内必须有这种类型的明确隐式值.如果我Predef.implicitly自己注射它,会发生这种情况:
scala> (1 to 10).sum(implicitly)
<console>:6: error: ambiguous implicit values:
both method conforms in object Predef of type [A]<:<[A,A]
and method stringCanBuildFrom in object Predef of type => scala.collection.generic.CanBuildFrom[String,Char,String]
match expected type T
(1 to 10).sum(implicitly)
^
Run Code Online (Sandbox Code Playgroud)
为什么这个含糊不清?
我可以使模糊性消失
scala> (1 to 10).sum(implicitly[Numeric[Int]])
res2: Int = 55
Run Code Online (Sandbox Code Playgroud)
要么
scala> (1 to 10).sum[Int](implicitly)
res3: …Run Code Online (Sandbox Code Playgroud) 我想知道如果Scala没有明确的企业支持,是否会获得应得的收益(我在想Sun/Oracle,但我想它可能是其他人,比如谷歌).
由于Sun最近决定不在JDK7中包含闭包,他们难道不能将他们的重量放在Scala那些希望拥有更具表现力的语言的Java替代品上吗?毕竟,在我看来,他们应该最关心的是JVM,而不是Java 本身.有人认为这可能吗?
假设我有一些具有actor_类型属性的类Actor.我做的有问题吗?
def someMethod() = {
actor_ ! "HELLO"
}
Run Code Online (Sandbox Code Playgroud)
或者应该始终从另一个演员发送消息; 例如
def someMethod() = {
Actor.actor { actor_ ! "HELLO" }
}
Run Code Online (Sandbox Code Playgroud) 我有一个服务器,它使用远程actor框架与多个客户端进行通信.正如这个问题所提到的,我无法跟踪客户何时消失.因此,我的服务器仍在尝试向不存在的客户端发送消息.
我有一个FileSystemXmlApplicationContext,我希望XML中定义的bean将构造函数参数作为未在Spring中声明的bean
例如,我想这样做:
<bean class="some.MyClass">
<constructor-arg ref="myBean" />
</bean>
Run Code Online (Sandbox Code Playgroud)
所以我可以想象这样做:
Object myBean = ...
context = new FileSystemXmlApplicationContext(xmlFile);
context.addBean("myBean", myBean); //add myBean before processing
context.refresh();
Run Code Online (Sandbox Code Playgroud)
除了没有这样的方法:-(有谁知道我怎么能做到这一点?
在Scala v 2.7.7中
我有一个文件
class Something[T] extends Other
object Something extends OtherConstructor[Something]
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
class Something
take type parameters object Something extends OtherConstructor [Something] {
但是,我不能这样做
object Something[T] extends OtherConstructor[Something[T]]
Run Code Online (Sandbox Code Playgroud)
它抛出一个错误:
错误:';' 预期,但'''发现.
是否可以将类型参数发送到对象?或者我应该改变并简单地使用Otherconstructor
我是Peter Pilgrim.我看过Martin Odersky在Scala中创建了一个控件抽象.但是我似乎还没有在IntelliJ IDEA 9中重复它.它是IDE吗?
package demo
class Control {
def repeatLoop ( body: => Unit ) = new Until( body )
class Until( body: => Unit ) {
def until( cond: => Boolean ) {
body;
val value: Boolean = cond;
println("value="+value)
if ( value ) repeatLoop(body).until(cond)
// if (cond) until(cond)
}
}
def doTest2(): Unit = {
var y: Int = 1
println("testing ... repeatUntil() control structure")
repeatLoop {
println("found y="+y)
y = y + 1
}
{ …Run Code Online (Sandbox Code Playgroud) 我试图在尽可能少的代码和尽可能功能的情况下执行以下操作:
def restrict(floor : Option[Double], cap : Option[Double], amt : Double) : Double
Run Code Online (Sandbox Code Playgroud)
显然以下工作:
= (floor -> cap) match {
case (None, None) => amt
case (Some(f), None) => f max amt
case (None, Some(c)) => c min amt
case (Some(f), Some(c)) => (f max amt) min c
}
Run Code Online (Sandbox Code Playgroud)
我真的希望有更优雅的东西,并且会接受使用Scalaz库!您可以假设以下情况属实:
floor.forall( f => cap.forall( _ > f))
Run Code Online (Sandbox Code Playgroud)
如果有人有兴趣,这里有一些测试代码:
object Comparisons {
sealed trait Cf {
def restrict(floor: Option[Double], cap: Option[Double], amt: Double): Double
}
def …Run Code Online (Sandbox Code Playgroud) 以下代码使用JDK6编译(我试过1.6.0_24)
class XY<A extends XY<A, B>, B extends XY<B, A>> { }
Run Code Online (Sandbox Code Playgroud)
但是在JDK7下编译(例如1.7.0),我得到了这个错误:
XY.java:1: error: type argument B is not within bounds of type-variable A
class XY<A extends XY<A, B>, B extends XY<B, A>> {
^
where B,A are type-variables:
B extends XY<B,A> declared in class XY
A extends XY<A,B> declared in class XY
1 error
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出这是否是对Java的泛型的故意改变?