问题是在Java中为什么我不能定义一个抽象的静态方法?例如
abstract class foo {
abstract void bar( ); // <-- this is ok
abstract static void bar2(); //<-- this isn't why?
}
Run Code Online (Sandbox Code Playgroud) Scala有一个号码,你可以为类型类使用,如性状Ordered,并Numeric在包装中scala.math.
例如,我可以使用Ordered如下方法编写泛型方法:
def f[T <% Ordered[T]](a: T, b: T) = if (a < b) a else b
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情Numeric,但这不起作用:
def g[T <% Numeric[T]](a: T, b: T) = a * b
Run Code Online (Sandbox Code Playgroud)
为什么Ordered和之间存在明显的差异Numeric?
我知道还有其他方法可以做到这一点,以下方法将起作用(使用上下文绑定):
def g[T : Numeric](a: T, b: T) = implicitly[Numeric[T]].times(a, b)
Run Code Online (Sandbox Code Playgroud)
但这看起来比仅仅能够*乘以两个数字更复杂.为什么Numeric特征不包括类似的方法*,而Ordered包括类似的方法<?
我知道Ordering你也可以用同样的方式使用Numeric,另见这个答案:
def f[A : Ordering](a: A, b: A) …Run Code Online (Sandbox Code Playgroud) 看起来scala将伴随对象中的方法编译为静态方法,这使得从java代码调用它们更容易一些.例如,您可以编写CompanionObject.method()而不是CompanionObject $ .MODULE $ .method().但是,有时看似无关的代码更改会破坏这种行为.我想出了这个例子来说明问题
$ cat TestCompanion.scala
class TestCompanion
object TestCompanion {
def init2 {}
}
@SerialVersionUID(1L)
class TestCompanion2
object TestCompanion2 {
def init2 {}
}
$ scalac -version
Scala compiler version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL
$ scalac TestCompanion.scala
$ javap TestCompanion
Compiled from "TestCompanion.scala"
public class TestCompanion extends java.lang.Object implements scala.ScalaObject{
public static final void init2();
public TestCompanion();
}
$ javap TestCompanion2
Compiled from "TestCompanion.scala"
public class TestCompanion2 extends java.lang.Object implements scala.ScalaObject{
public static final long serialVersionUID; …Run Code Online (Sandbox Code Playgroud)