2017-06-09 19 views
5

Tôi có một phương pháp trong Java như vậy:Giao lộ có thể được thực hiện trong Kotlin không?

public <T extends A & B> methodName(T arg, ...) 

trong đó A là một lớp và B là một giao diện.

Trong lớp Kotlin của tôi, tôi có một variable loại C, và tôi muốn đạt được như sau:

if (variable is A && variable is B) { 
    methodName(variable, ...) 
} else { 
    // do something else 
} 

Có thể đúc đúng variable để nó có thể được sử dụng như một cuộc tranh cãi không có lỗi ?

Hiện tại, variable có phương pháp setter, do đó, tính năng truyền thông minh không phải là khả dụng. Tuy nhiên, tôi cũng đã thử nghiệm nó với một địa phương val và giá trị được suy ra để có loại Any mà không giúp đỡ.

+0

Phiên bản kotlin của bạn là gì? –

+2

Đây là một vấn đề liên quan: https://youtrack.jetbrains.com/issue/KT-7304 –

Trả lời

1

Kotlin không hỗ trợ các loại giao lộ. Điều này gây ra variable để truyền thông minh thành Any, bởi vì đó là tổ tiên chung của AB.

Tuy nhiên, Kotlin hỗ trợ các ràng buộc loại chung. Bạn có thể sử dụng điều này để hạn chế tham số kiểu cho một hoặc nhiều loại. Điều này có thể được sử dụng trên cả hai phương thức và các lớp. Đây là cú pháp cho các chức năng (tương đương với methodName của bạn trong Kotlin):

fun <T> methodName(arg: T) 
    where T : A, 
      T : B { 
    .... 
} 

Bạn có thể sử dụng điều này để có được xung quanh vấn đề của bạn bằng cách tạo ra một lớp học kéo dài cả AB, và sau đó các đại biểu việc thực hiện các loại cho đối tượng của bạn. Như thế này:

class AandB<T>(val t: T) : A by t, B by t 
    where T : A, 
      T : B 

Bây giờ bạn có thể gọi methodName bằng cách thay đổi thử nghiệm nếu-bạn để kiểm tra nếu nó là một AandB<*>:

if (variable is AandB<*>) { 
    methodName(variable, ...) 
} 

Bạn cần phải quấn variable trong một đâu đó AandB mặc dù. Tôi không nghĩ rằng bạn có thể làm điều đó nếu bạn không có thông tin loại cho variable khả dụng ở mọi nơi.

Lưu ý: Lớp AandB không triển khai hashCode, equals hoặc toString. Bạn có thể thực hiện chúng để ủy quyền thực hiện t.

Lưu ý 2: Điều này chỉ hoạt động nếu AB là các giao diện. Bạn không thể ủy quyền cho một lớp học.

+0

Như bạn đã đề cập và như tôi đã thử nghiệm, cả A và B phải là giao diện. Tuy nhiên, hàm của tôi là kiểu T trong đó T: [lớp], T: [giao diện]. Có đường nào quanh đó không? Phương pháp của bạn là rất thú vị dù sao. –

Các vấn đề liên quan