https://kotlinlang.org logo
#russian
Title
# russian
a

Alexjok

04/03/2019, 2:37 PM
Привет всем! Подскажите кто-нибудь как прокинуть тип в Builder в коде ниже:
Copy code
class MyRequest<T>(private var url: String? = null,
        private var timeOut: Int = 1,
        private var token: String? = null,
        private var httpType: HttpType? = null,
        private var httpParamas: List<Pair<String, String>> = listOf(),
        private var returnResultAs: T? = null) {

   
    data class Builder(
        var url: String? = null,
        var httpType: HttpType? = null,
        var timeOut: Int = 1,
        var token: String? = null,
        var httpParamas: List<Pair<String, String>> = listOf()) {
            fun url(url: String) = apply { this.url = url }
            fun httpType(httpType: HttpType) = apply { this.httpType = httpType }
            fun timeOut(timeOut: Int) = apply { this.timeOut = timeOut }
            fun httpParamas(httpParamas: List<Pair<String, String>>) = apply { this.httpParamas = httpParamas }

            fun token(token: String) = apply { this.token = token }
            fun build() = MyRequest(url = url,
                timeOut = timeOut,
                token = token,
                httpType = httpType,
                httpParamas = httpParamas
            )
        }
	}
Может есть какие-нибудь другие способы сделать, что-то подобное.
g

gildor

04/03/2019, 2:46 PM
что значит “прокинуть тип в Builder”?
a

Alexjok

04/03/2019, 3:05 PM
Убрал лишнее из кода
Copy code
fun main(args: Array<String>) {
    
    val req = MyRequest.Builder().url("<http://www.ok.com|www.ok.com>")
	                             .returnResultAs(String::class.java)
								 .build()
    val result = req.execute() //результатом будет строка
	
}

class MyRequest<T>(private var url: String? = null,
                   private var returnResultAs: T? = null) {


    data class Builder(
        var url: String? = null,
        var returnResultAs: Class<*>? = null) {
            fun url(url: String) = apply { this.url = url }
         
            fun returnResultAs(returnResultAs: Class<*>?) = apply { this.returnResultAs = returnResultAs }
            fun build() = ArcGisRequest(url = url,
                timeOut = timeOut,
                token = token,
                httpType = httpType,
                httpParamas = httpParamas,
                returnResultAs = returnResultAs
            )
        }
    
    fun execute(): T {
	    //делаем что-то в результате возвращаем переданный в returnResultAs тип
        return returnResultAs!!
    }
}
Идея в том, чтобы время создания обьекта передавать в Builder тип, который мы хотим вернуть (параметр "returnResultAs") и затем при вызове execute() получать его.
g

gildor

04/03/2019, 3:06 PM
Ну для этого Builder нужно типизирвать для начала
a

Alexjok

04/03/2019, 3:12 PM
Оке, сейчас попробую в эту сторону поковырять
не получается блин(
разобрался, какой же я деградант все таки. Спасибо!)
2 Views