Size: a a a

Kotlin Community

2019 December 05

AN

Alexander Nozik in Kotlin Community
Ну спейс тут обсуждаем, но да, виноват
источник

AN

Alexander Nozik in Kotlin Community
я тут еле живой после всего этого спейса
источник

BP

Bogdan Panchenko in Kotlin Community
Andrey Afrikanov
В Java можно было сделать так:
class Base<T extends Base> {

public void doSomething(){
          ...
          return (T)this;
       }
}

class A extends Base<A>{

public void doAnother(){
          ...
          return this;
       }

}

// Чтобы можно было делать fluent-вызовы
new A().doSomething().doAnother()

Подскажите как заменить в Kotlin описание Generic-типа (Base<T extends Base>), который должен быть наследником кого-то то класса ?
open class Base<out T : Base> {
   агт doSomething(): T {
        return this
   }
}
- вроде так
источник

BP

Bogdan Panchenko in Kotlin Community
Andrey Afrikanov
В Java можно было сделать так:
class Base<T extends Base> {

public void doSomething(){
          ...
          return (T)this;
       }
}

class A extends Base<A>{

public void doAnother(){
          ...
          return this;
       }

}

// Чтобы можно было делать fluent-вызовы
new A().doSomething().doAnother()

Подскажите как заменить в Kotlin описание Generic-типа (Base<T extends Base>), который должен быть наследником кого-то то класса ?
PS у вас джава методы неерные 🌚
источник

AA

Andrey Afrikanov in Kotlin Community
ну на коленке накидывал, да - неверные: public A doAnother() / public T doSomething()
источник

AA

Andrey Afrikanov in Kotlin Community
источник

BP

Bogdan Panchenko in Kotlin Community
попробуй в методе
источник

AA

Andrey Afrikanov in Kotlin Community
да то же самое (
источник

VP

Vladimir Petrakovich in Kotlin Community
Andrey Afrikanov
В Java можно было сделать так:
class Base<T extends Base> {

public void doSomething(){
          ...
          return (T)this;
       }
}

class A extends Base<A>{

public void doAnother(){
          ...
          return this;
       }

}

// Чтобы можно было делать fluent-вызовы
new A().doSomething().doAnother()

Подскажите как заменить в Kotlin описание Generic-типа (Base<T extends Base>), который должен быть наследником кого-то то класса ?
В котлине это не нужно, просто используйте apply/run/with
источник

AA

Andrey Afrikanov in Kotlin Community
хм, с такими терминами ещё не знаком (
источник

BP

Bogdan Panchenko in Kotlin Community
Andrey Afrikanov
да то же самое (
там класс нельзя + нужно явно указывать дженерик для Base
источник

BP

Bogdan Panchenko in Kotlin Community
Andrey Afrikanov
хм, с такими терминами ещё не знаком (
val a = A().apply {
   doSomething()
   doAnother()
}
источник

BP

Bogdan Panchenko in Kotlin Community
PS это инлайн функциии
источник

AA

Andrey Afrikanov in Kotlin Community
в принципе да, подойдёт. Спасибо
источник

BP

Bogdan Panchenko in Kotlin Community
interface Build<out T : Build<T>> {
   fun foo(): T {
       return this as T
   }
}

class A : Build<A> {
   fun bar(): A {
       return this
   }
}

fun main() {
 val a = A().apply {
     foo()
     bar()
 }
   
   a.foo().bar()
}
источник

AS

Anthony Styzhin in Kotlin Community
Andrey Afrikanov
хм, с такими терминами ещё не знаком (
Самый котлин стайл, советую присмотреться к ним внимательно, но сильно не злоупотреблять до нечитаемости ;)
источник

BP

Bogdan Panchenko in Kotlin Community
немножко костильненько) @AfrikanovAndrey
источник

BP

Bogdan Panchenko in Kotlin Community
Anthony Styzhin
Самый котлин стайл, советую присмотреться к ним внимательно, но сильно не злоупотреблять до нечитаемости ;)
+++
источник

AA

Andrey Afrikanov in Kotlin Community
сложно конечно сразу мышление перестроить
источник

AA

Andrey Afrikanov in Kotlin Community
у каждого языка свои паттерны
источник