Mã sau đây cố gắng bắt chước Polymorphic Embedding of DSLs: thay vì đưa ra hành vi trong Inner
, nó được mã hóa theo phương pháp useInner
của lớp kèm theo của nó. Tôi đã thêm phương thức enclosing
để người dùng chỉ có thể tham chiếu đến Inner
trường hợp, nhưng luôn có thể có được trường hợp kèm theo của họ. Bằng cách này, tất cả các cá thể Inner
từ một cá thể Outer
cụ thể chỉ được gắn với một hành vi (nhưng nó được yêu cầu ở đây).Đề cập đến loại của một lớp bên trong trong Scala
abstract class Outer {
sealed class Inner {
def enclosing = Outer.this
}
def useInner(x:Inner) : Boolean
}
def toBoolean(x:Outer#Inner) : Boolean = x.enclosing.useInner(x)
Nó không biên dịch và scala 2,8 phàn nàn về:
type mismatch; found: sandbox.Outer#Inner
required: _81.Inner where val _81:sandbox.Outer
Từ Programming Scala: Nested classes và A Tour of Scala: Inner Classes, có vẻ như với tôi rằng vấn đề là useInner
hy vọng như là đối số một Inner
dụ từ một Outer
dụ cụ thể .
Giải thích thực sự là gì và cách giải quyết vấn đề này?
Có thể thế nào để sửa đổi toBoolean thay vì useInner? –
Nếu cố gắng 'def toBoolean (x: y.Inner forSome {val y: Outer}): Boolean = x.enclosing.useInner (x)' (Các loại tồn tại - Định lượng tồn tại so với giá trị từ tham chiếu Scala) nhưng nó không công việc. –