2012-06-17 37 views
6

Người ta có thể nói một kiểu tham số T phải có một S_1 supertype cụ thể:Làm thế nào để nói rằng một tham số kiểu phải có một siêu kiểu siêu kiểu thay thế?

class Test[T <: S_1] 

Có cách nào để nói, rằng một số loại phải có ít nhất một siêu kiểu của nhiều lựa chọn thay thế supertype? Giống như (giả):

class Test[T <: S_1 || S_2] 

Hoặc: Đây có phải là không thể, bởi vì một công trình như vậy làm cho không có ý nghĩa và sẽ là một gợi ý của một sai lầm thiết kế trong mã?

+0

Bạn có thể đưa ra ví dụ về cách sử dụng có thể được sử dụng không? Bạn đang nghĩ đến một trường hợp trong đó các đối tượng của tham số kiểu 'T' sẽ chỉ sử dụng một phương thức có cùng chữ ký trong các kiểu không liên quan' S_1' và 'S_2'? –

+4

Điều bạn đang tìm kiếm là một loại * công đoàn *; xem câu hỏi này: http://stackoverflow.com/q/3508077/770361 –

Trả lời

9

Câu trả lời ngắn: Giải pháp trực quan là làm cho S_1S_2 chia sẻ một đặc điểm phổ biến mà đại diện cho tập hợp các khả năng mà bạn cần cho tham số kiểu của bạn T. Sử dụng đặc điểm đó làm giới hạn trên cho T.

Nhiều khả năng:

  • Nếu S_1S_2 không liên quan trong tự nhiên và những yêu cầu đối với loại T là nó có một số thành viên (có cả S_1S_2 xảy ra để thực hiện), bạn có thể sử dụng một structural type để xây dựng điều đó (khái niệm đằng sau được gọi là duck typing).

  • Nếu vì một lý do nào bạn thực sự đòi hỏi T là một lớp con của S_1 hoặc S_2, và bạn không thể thay đổi các loại, bạn có thể sử dụng để chuyển đổi implicits cả hai đến một nội kiểu mới giới thiệu S_1_or_2, mà bạn sau đó có thể sử dụng làm giới hạn trên cho số T của bạn.

3

Hãy để tôi mở rộng trên Niklas thay thế thứ hai. Tham số ngầm định có thể được sử dụng để chứng minh điều gì đó về loại, vì vậy điều này có vẻ như chỉ là điều. Nó sẽ như sau:

class ThingIWantToProve[T] 
object ThingIWantToProve { 
    // Here I define the proofs I need 
    implicit def s1IsProvable: ThingIWantToProve[S_1] = new ThingIWantToProve[S_1] 
    implicit def s2IsProvable: ThingIWantToProve[S_2] = new ThingIWantToProve[S_2] 
} 
class Test[T : ThingIWantToProve] // here I use a context bound 
Các vấn đề liên quan