Пытаясь избежать проблемы, описанной в разделе Как предоставить реализацию классов JDK (например, java.awt) в проекте Scala.js?, я придумал решение с использованием другого пакета и перенаправлением (алиасингом) классов awt
в него на JVM (в Scala.js я просто предоставляю заглушки прямо в этом пакете):
package object jawt {
type RenderingHints = java.awt.RenderingHints
object RenderingHints {
type Key = java.awt.RenderingHints.Key
val KEY_TEXT_ANTIALIASING = java.awt.RenderingHints.KEY_TEXT_ANTIALIASING
val VALUE_TEXT_ANTIALIAS_ON = java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON
}
type Color = java.awt.Color
object Color {
val GREEN = java.awt.Color.GREEN
val YELLOW = java.awt.Color.YELLOW
val WHITE = java.awt.Color.WHITE
val BLACK = java.awt.Color.BLACK
val RED = java.awt.Color.RED
}
object image {
type BufferedImage = java.awt.image.BufferedImage
object BufferedImage {
val TYPE_INT_RGB = java.awt.image.BufferedImage.TYPE_INT_RGB
}
}
type Graphics2D = java.awt.Graphics2D
}
Это работает довольно хорошо, единственное, что мне не нравится, это то, что мне приходится писать отдельный псевдоним для любого статического члена любого класса Java, который я использую. При использовании этого пакета часто пишут, например. g2d.setColor(jawt.Color.BLACK)
. Обычно при работе с классами Scala это решается путем создания псевдонима для объекта-компаньона, например:
type Color = scala.awt.Color
val Color = scala.awt.Color
Это не работает с Java, так как java.awt.Color
не является значением (см. также статические члены класса Java и совместимость Scala):
класс java.awt.Color не является значением
При псевдониме только типа компилятор Scala не может получить доступ к статическим методам:
объект Color не является членом пакета net.gamatron.jawt
Примечание: тип Color существует, но не имеет сопутствующего объекта.
Есть ли способ создать псевдоним класса Java, чтобы к статическим значениям и методам можно было получить доступ через псевдоним?