Как я могу использовать java.lang.Integer внутри Scala - PullRequest
3 голосов
/ 25 февраля 2011

Я хочу использовать статический метод Integer#bitCount(int).Но я обнаружил, что я не могу использовать псевдоним типа, чтобы добиться этого.В чем разница между псевдонимом типа и псевдонимом импорта?

scala> import java.lang.{Integer => JavaInteger}
import java.lang.{Integer=>JavaInteger}

scala> JavaInteger.bitCount(2)
res16: Int = 1

scala> type F = java.lang.Integer
defined type alias F

scala> F.bitCount(2)
<console>:7: error: not found: value F
       F.bitCount(2)
       ^

Ответы [ 4 ]

7 голосов
/ 25 февраля 2011

В Scala вместо статического метода используется одноэлементный объект-компаньон.

Тип одноэлементного объекта-компаньона отличается от класса-компаньона, а псевдоним типа связан с классом, а не с одноэлементным объектом.

Например, у вас может быть следующий код:

class MyClass {
    val x = 3;
}

object MyClass {
    val y = 10;
}

type C = MyClass // now C is "class MyClass", not "object MyClass"
val myClass: C = new MyClass() // Correct
val myClassY = MyClass.y // Correct, MyClass is the "object MyClass", so it has a member called y.
val myClassY2 = C.y // Error, because C is a type, not a singleton object.
3 голосов
/ 25 февраля 2011

Вы не можете сделать это, потому что F является типом, а не объектом, и поэтому не имеет статического члена. В более общем смысле, в Scala нет статического члена: вам необходимо реализовать его в одноэлементном объекте, который представляет «статический компонент» класса.

В результате в вашем случае вам нужно обратиться непосредственно к классу Java, чтобы Scala знала, что он может содержать статические члены.

2 голосов
/ 27 февраля 2011

Вы можете создать ярлык для статического метода Java следующим образом

val bitCount:(Int) => Int = java.lang.Integer.bitCount
2 голосов
/ 25 февраля 2011

F - это статический тип, это не объект и не класс.В Scala вы можете отправлять сообщения только объектам.

class MyClass  // MyClass is both a class and a type, it's a class because it's a template for objects and it's a type because we can use "MyClass" in type position to limit the shape of computations

type A = MyClass  // A is a type, even if it looks like a class.  You know it's a type and not a class because when you write "new A.getClass" what you get back is MyClass. The "new" operator takes a type, not a class.  E.g. "new List[MyClass]" works but "new List" does not.

type B = List[MyClass] // B is a type because List[MyClass] is not a class

type C = List[_ <: MyClass] // C is a type because List[_ <: MyClass] is clearly not a class

В чем разница между классом и типом в Scala (и Java)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...