简体   繁体   English

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

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

I have a Java class which extends AsyncTask like this:我有一个像这样扩展 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;
    }

}

My goal is to translate the code into Kotlin.我的目标是将代码翻译成 Kotlin。 Now I have this:现在我有这个:

 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 red-underlines those 2 lines inside the constructor, saying "Expecting member declaration". Android Studio 用红色在构造函数中的这两行下划线,表示“期望成员声明”。 Wrapping those 2 lines inside "init {}" block will change the error message into "Unresolved reference: lat", for example.例如,将这两行包装在“init {}”块中会将错误消息更改为“Unresolved reference: lat”。

What's the correct translation, then?那么正确的翻译是什么?

Do this.做这个。

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
    }
}

I hope it helps我希望它有帮助

I think so我想是这样

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

}

Kotlin hastwo types of constructors . Kotlin 有两种类型的构造函数 First one is that goes after class name and second is that contains body of class and is declared as 'constructor'第一个是在类名之后,第二个是包含类的主体并被声明为“构造函数”

In your case I'd make something like在你的情况下,我会做类似的事情

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()
}

Solution: Here is the correct translation code in Kotlin. 解决方案:这是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
    }
}

A shorter version 较短的版本

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