Tôi đã đọc phần 20,7 của Lập trình cuốn sách trong Scala và tôi đã tự hỏi tại sao trong khi mã này biên dịch:loại Scala: Class A không phải là tương đương với T trong đó T là: loại T = A
class Food
class Fish extends Food
class Grass extends Food
abstract class Animal {
type SuitableFood <: Food
def eat(food: SuitableFood)
}
class Cow extends Animal {
type SuitableFood = Grass
override def eat(food: Grass) {}
}
val bessy: Animal = new Cow
bessy eat (new bessy.SuitableFood)
mã này không (phần còn lại của mã là giống như trước đây, chỉ có những thay đổi dòng cuối cùng):
bessy eat (new Grass)
Và như xa như tôi hiểu được loại cỏ là như nhau của Cow.SuitableFood.
Ngoài ra, tôi có một câu hỏi liên quan ví dụ này:
Nếu Bessy là loại động vật, làm thế nào có thể trình biên dịch biết rằng nó cần một loại SuitableFood -> Grass thay vì một loại thực phẩm? Vì cố gắng để cung cấp một thực phẩm mới mang lại cho tôi một lỗi biên dịch của loại không phù hợp, nhưng Animal lớp cần một loại thực phẩm và loại Bessy được định nghĩa một cách rõ ràng: Animal
Đề xuất: thêm thẻ _path-dependent-type_ vào câu hỏi này. Điều đó có thể thu hút một câu trả lời từ một người biết nhiều hơn về chính xác loại khó khăn này. (Tôi vẫn đang đấu tranh với các loại phụ thuộc vào con đường mình.) –
@BenKovitz Đã thêm, cảm ơn. – vicaba