Tôi đang cố gắng sử dụng loại đối tượng trường hợp làm loại trừu tượng. Tôi rất ngạc nhiên khi nhìn thấy (tương tự) mã bên dưới biên dịch:Làm thế nào để cụ thể thiết lập loại trừu tượng với loại bị ràng buộc?
sealed abstract class Bar
case object BarOne extends Bar
case object BarTwo extends Bar
sealed abstract class Foo {
type A <: Bar
def f: A
}
object Foo {
object FooOne extends Foo {
type A = BarOne.type
val f = BarTwo
}
object FooTwo extends Foo {
type A = BarTwo.type
val f = BarOne
}
}
Trong ví dụ thật của tôi Foo
được parametrized và sử dụng như một lớp hợp cụ thể. Vì vậy, tôi không thể chỉ thực hiện một tham số loại A
.
Làm thế nào để f = BarTwo
biên dịch, khi A
được đặt thành BarOne.type
?
Nếu A
trong f: A
được hiểu là A <: Bar
, tại sao vậy?
Có cách nào cụ thể được đặt A
cho mỗi trường hợp đối tượng của Foo
không?
Tôi đang sử dụng Scala 2.11.8.
Cập nhật: khi tôi thay val attributeType = ...
với def attributeType = ...
trong FooOne
& FooTwo
biên soạn thất bại (như mong đợi).
Là mất tích 'kéo dài Foo' trên' FooOne' và 'FooTwo' một lỗi đánh máy? Bởi vì nó không biên dịch nếu bạn thêm nó. –
@EndeNeu Đó là một sự giám sát. Và bạn nói đúng, nó không biên dịch (như mong đợi). Tôi đã cập nhật câu hỏi để làm cho nó trông gần nhất có thể với mã thực. Tất nhiên nó không sử dụng vì mã trên không biên dịch và mã của tôi biên dịch. – muhuk
@muhuk nếu mã ở trên không biên dịch thì nó không đại diện cho mã biên dịch của bạn. Câu hỏi này không phải là câu trả lời trừ khi bạn nhận được một ví dụ tối thiểu chính xác. – Daenyth