繁体   English   中英

如何正确地将 Java 构造函数转换为 Kotlin?

[英]How to translate Java construtor to Kotlin properly?

我有一个像这样扩展 AsyncTask 的 Java 类:

class PostLocationTask extends AsyncTask<String, Void, String> {
    private String responseServer;
    private double latitude, longitude

    public PostLocationTask(double latitude, double longitude){
        this.latitude = latitude;
        this.longitude = longitude;
    }

}

我的目标是将代码翻译成 Kotlin。 现在我有这个:

 companion object {
        class PostLocationTask internal constructor (context: PostLocationActivity): AsyncTask<String, Void, String?>(){

            private var responseServer = ""
            private var lat = 0.0
            private var lon = 0.0

            class PostLocationTask(var currentLat:Double, var currentLon:Double){
                lat = currentLat
                lon = currentLon
            }
        }
}

Android Studio 用红色在构造函数中的这两行下划线,表示“期望成员声明”。 例如,将这两行包装在“init {}”块中会将错误消息更改为“Unresolved reference: lat”。

那么正确的翻译是什么?

做这个。

import android.os.AsyncTask
import android.os.Build
import android.support.annotation.RequiresApi

@RequiresApi(Build.VERSION_CODES.CUPCAKE)
internal class PostLocationTask(
    private val latitude: Double, 
    private val longitude: Double) : AsyncTask<String, Void, String>() {
        
        private val responseServer: String? = null

        override fun doInBackground(vararg strings: String): String? {
            return null
    }
}

我希望它有帮助

我想是这样

class PostLocationTask 
constructor(var latitude: Double, var longitude: Double) : AsyncTask<String, Void, String>() {
    private var responseServer: String? = null

}

Kotlin 有两种类型的构造函数 第一个是在类名之后,第二个是包含类的主体并被声明为“构造函数”

在你的情况下,我会做类似的事情

class PostLocationTask(
    var latitude: Double? = null, 
    var longitude: Double? = null
) : AsyncTask<String, Void, String>() {
    var responseServer: String? = null
    override fun doInBackground(vararg params: String?): String = getLocationFromServer()
}

解决方案:这是Kotlin中正确的翻译代码。

inner class PostLocationTask(latitude: Double, longitude: Double) : AsyncTask<String, Void, String>() {
    private var responseServer: String? = null
    private var latitude: Double = latitude
    private var longitude: Double = longitude

    override fun doInBackground(vararg strings: String): String? {
        return null
    }
}

较短的版本

inner class PostLocationTask(private var latitude: Double, private var longitude: Double) : AsyncTask<String, Void, String>() {
    private var responseServer: String? = null

    override fun doInBackground(vararg strings: String): String? {
        return null
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM