2012-04-23 9 views
5

Cân nhắc chúng ta có:Đối số chức năng: giới hạn trên so với lớp cha làm đối số?

abstract class FlyingObject; 
case class Rocket(name: String) extends FlyingObject; 

sự khác biệt giữa hai tờ khai chức năng là gì:

def launch[T <: FlyingObject](fo: T) 

def launch(fo: FlyingObject) 

lớn sẽ là một số ví dụ khi sử dụng loại hình khai. ..

[UPDATE]

Một ví dụ và giải thích tuyệt vời khác có thể được tìm thấy there. Đó là một ví dụ khác khi bạn nên sử dụng giới hạn trên thay vì chỉ là lớp dẫn xuất như tham số.

Trả lời

7

Có thể hữu ích khi có một T cụ thể hơn FlyingObject. Có thể tưởng tượng bạn có một phương pháp

def modifyName(fo: FlyingObject, newName: String): FlyingObject = fo.copy(name=newName) 

Trả về bản sao FlyingObject với tên được sửa đổi. Điều đó làm cho mã này không bị lỗi:

val newRocket: Rocket = modifyName(oldRocket, "new name") 

Vì modifyName trả về FlyingObject không phải là tên lửa. thay vì:.

def modifyName[T <: FlyingObject](fo: T, newName: String): T = fo.copy(name=newName) 

sẽ trả về một Rocket khi Rocket là những gì được thông qua tại

+0

Nói cách khác, nó quan trọng đặc biệt khi kiểu trả về là loại T. –

+2

@LuigiPlinge: có lẽ khi nó được sử dụng ở bất kỳ nơi nào khác trong chữ ký loại. Đối với bạn có thể muốn 'def so sánh [T <: FlyingObject] (một: T, hai: T)' cũng – stew

4

Ngoài @stew câu trả lời, một giới hạn trên có thể hữu ích khi sử dụng typeclasses. Ví dụ: giả sử bạn muốn một phương thức lấy hai vật thể bay cũng như đối tượng va chạm xác định cách quản lý va chạm với các đối tượng khác. Tất nhiên, một va chạm tiểu hành tinh không giống như một vụ va chạm không gian - tiểu hành tinh (ví dụ sách giáo khoa cổ điển).

Bạn có thể viết phương pháp như:

def collide[A <: FlyingObject, B <: FlyingObject] 
    (a: A, b: B)(implicit collider: Collider[A,B]) = collider.apply(a,b) 

Sau đó trình biên dịch sẽ cung cấp một đúng Collider cho bạn. Nếu thay vào đó bạn đã viết:

def collide(a: FlyingObject, b: FlyingObject) = a.collide(b) 

Bạn sẽ phải dựa vào tính năng Obect-Oriented để quản lý va chạm sẽ thực sự khó viết và duy trì (vấn đề công văn kép).

+0

Bổ sung tuyệt vời vào câu trả lời của @stew .. +1 – PrimosK