String original = "hello world";
byte[] utf8Bytes = original.getBytes("UTF-8");
Это работает для меня в 2.8 и 2.11 и позволит вам не вмешиваться в черты A
или B
:
trait A { def hi = println("A") }
trait B { def hi = println("B") }
class C extends A with B {
override def hi = super[B].hi
def howdy = super[A].hi // if you still want A#hi available
}
object App extends Application {
(new C).hi // prints "B"
}
Вы можете использовать общий базовый признак, скажем Base
, следующим образом:
trait Base {def hi: Unit}
trait A extends Base {override def hi = println("A")}
trait B extends Base {override def hi = println("B")}
class C extends A with B
С иерархией типов результат вызова hi
выглядит следующим образом (обратите внимание на использование {}
для создания экземпляров признаков):
scala> (new A {}).hi
A
scala> (new B {}).hi
B
scala> (new C).hi
B
Типаж добавляет методы к классу, который его смешивает. Если два трейта добавляют один и тот же метод, в классе будут два идентичных метода, чего, конечно, не может быть.
Однако, если метод является частным в трейте, это не вызовет проблемы. И если вы хотите, чтобы методы накладывались друг на друга, вы можете определить базовый признак, а затем абстрактное переопределение
для наследующих признаков. Однако для определения метода требуется класс. Вот пример этого:
scala> trait Hi { def hi: Unit }
defined trait Hi
scala> trait A extends Hi { abstract override def hi = { println("A"); super.hi } }
defined trait A
scala> trait B extends Hi { abstract override def hi = { println("B"); super.hi } }
defined trait B
scala> class NoHi extends Hi { def hi = () }
defined class NoHi
scala> class C extends NoHi with B with A
defined class C
scala> new C().hi
A
B
Если, однако, вам действительно нужны два отдельных метода для каждого признака, тогда вам потребуется составить вместо наследовать .
Это проблема ромба . Какой метод hi
должен быть унаследован: метод от A или метод от B? Вы можете обойти это, как предложил Дон, используя общую базовую черту.