Tại sao 'kotlin.Result' không thể được sử dụng làm kiểu trả về?


84

Tôi đã tạo một phương thức và trả về nằm Result<R>trong một lớp của MyClass<R>, nhưng thông báo lỗi là: 'kotlin.Result' không thể được sử dụng làm kiểu trả về

Tôi cũng đã xem xét mã nguồn Kết quả để biết một số gợi ý; tại sao cái này rất?

Mã thử nghiệm (sử dụng phiên bản 1.3-RC).

class MyClass<R>(val r: R) {
    fun f(): Result<R> { // error here
        return Result.success(r)
    }
}

fun main(args: Array<String>) {
    val s = Result.success(1)
    val m = MyClass(s)   
}

Cho chúng tôi xem mã của bạn gây ra lỗi. Từ đâu kotlin.Resultđến? Tôi không thể tìm thấy lớp đó trong thư viện tiêu chuẩn .
Jesper

Hãy thử Kotlin 1.3 hoặc mới hơn
Ersin-Ertan

Câu trả lời:


60

Từ Kotlin KEEP :

Lý do đằng sau những hạn chế này là các phiên bản tương lai của Kotlin có thể mở rộng và / hoặc thay đổi ngữ nghĩa của các hàm trả về kiểu Kết quả và toán tử null-safe có thể thay đổi ngữ nghĩa của chúng khi được sử dụng trên các giá trị của Kiểu kết quả. Để tránh phá vỡ mã hiện có trong các bản phát hành trong tương lai của Kotin và để ngỏ cho những thay đổi đó, việc sử dụng tương ứng sẽ tạo ra lỗi ngay bây giờ. Các ngoại lệ đối với quy tắc này được thực hiện cho các khai báo được xem xét cẩn thận trong thư viện tiêu chuẩn, là một phần của chính API loại kết quả.

Lưu ý: nếu bạn chỉ muốn thử nghiệm với Resultkiểu, bạn có thể bỏ qua giới hạn này bằng cách cung cấp đối số trình biên dịch Kotlin -Xallow-result-return-type.

Khi sử dụng Gradle trên dự án Java hoặc Android: Xác định đối số trình biên dịch trên tác vụ biên dịch Kotlin. Nó áp dụng cho cả mã sản xuất và thử nghiệm.

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = freeCompilerArgs + "-Xallow-result-return-type"
    }
}

Khi sử dụng Gradle trên dự án Multiplatform: Xác định đối số trình biên dịch cho mỗi biên dịch đích. Nó áp dụng cho cả mã sản xuất và thử nghiệm.

kotlin {
    targets.all {
        compilations.all {
            kotlinOptions {
                freeCompilerArgs = freeCompilerArgs + "-Xallow-result-return-type"
            }
        }
    }
}

2
bạn có thể vui lòng thêm một đoạn mã về cách nó có thể được thực hiện trong gradle?
saiedmomen

các phần 'tiến bộ trong tương lai' của GIỮ mà giải thích một số thay đổi phá tiềm năng mà thúc đẩy những hạn chế
gMale

Ngoài ra, bạn có thể sử dụng cách triển khai khác của loại Kết quả được cung cấp bởi github.com/michaelbull/kotlin-result hoặc github.com/kittinunf/Result
lecker909


8

Nếu sử dụng maven:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <configuration>
        <jvmTarget>1.8</jvmTarget>
        <args>
            <arg>-Xallow-result-return-type</arg>
        </args>
    </configuration>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

Nếu sử dụng gradle:

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
    kotlinOptions.freeCompilerArgs = ["-Xallow-result-return-type"]


}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
    kotlinOptions.freeCompilerArgs = ["-Xallow-result-return-type"]
}

Nguồn: http://rustyrazorblade.com/post/2018/2018-12-06-kotlin-result/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.