Todas as três formas são válidas e têm o efeito Bassumido como o tipo de thisclasse A.
As duas primeiras variantes
trait A { self: B => ... }
trait A { foo: B => ... }
introduzir self(respectivamente foo) como um alias para thisna característica A. Isso é útil para acessar a thisreferência de uma classe interna. Ou seja, você poderia usar em selfvez de A.thisacessar a thisreferência do traço Ade uma classe aninhada dentro dele. Exemplo:
class MyFrame extends JFrame { frame =>
getContentPane().add( new JButton( "Hide" ) {
addActionListener( new ActionListener {
def actionPerformed( e: ActionEvent ) {
// this.setVisible( false ) --> shadowed by JButton!
frame.setVisible( false )
}
})
})
}
A terceira variante,
trait A { this: B => ... }
não introduz um alias para this; apenas define o tipo de auto.