相关疑难解决方法(0)

为什么静态方法在Java中不能是抽象的

问题是在Java中为什么我不能定义一个抽象的静态方法?例如

abstract class foo {
    abstract void bar( ); // <-- this is ok
    abstract static void bar2(); //<-- this isn't why?
}
Run Code Online (Sandbox Code Playgroud)

java abstract-class static-methods

572
推荐指数
8
解决办法
26万
查看次数

为什么Numeric的行为与Ordered不同?

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 typeclass

10
推荐指数
3
解决办法
293
查看次数

伴随对象中的方法在scala中编译成静态方法?

看起来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)

scala

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

标签 统计

scala ×2

abstract-class ×1

java ×1

static-methods ×1

typeclass ×1