Android Studio 3.2.1 Kotlin plugin version 1.3.11-release-Studio3.2-1 ext.kotlin_version = '1.3.11' RxJava 1.3.0 Por ejemplo, cuando escribo el archivo *.kt : Observable.unsafeCreate{} y luego presiono Ctrl+Space entre {} , luego IntellijIdea me sugiere que escriba el símbolo t -> , pero cuando hago lo mismo en el archivo .java , el resultado es subscriber -> :
*.kt :
fun anyFunc(): Observable<Boolean>{ return Observable.unsafeCreate { t -> t } } archivo *.java :
public void anyFunc() { Observable.unsafeCreate(subscriber -> {}); }¿Cómo hacer que el archivo Kotlin tenga el mismo comportamiento de escritura de sugerencias que en el archivo Java?
[ACTUALIZAR] Parece que se debe al método call() en rx.functions.Func1 , tiene param t :
public interface Func1<T, R> extends Function { R call(T t); }Estoy usando
Estudio Android 3.2.1 ,
rxjava:2.2.0 ,
Complemento Kotlin versión 1.3.11-release-Studio3.2-1
Después de escribir el archivo *.kt : Observable.unsafeCreate{} y presionar Ctrl+Espacio entre {} , Android Studio me muestra la siguiente sugerencia:
La misma sugerencia que muestra Android Studio cuando estoy escribiendo en el archivo *.java .
No hice ningún cambio de configuración en las Preferencias de Android Studio.
Supongo que está importando Observable desde rx , el primer elemento en la lista de finalización en la imagen a continuación. Intente importar Observable desde io.reactivex : elemento resaltado en la lista de finalización a continuación, puede ayudar: import io.reactivex.Observable .
Para usarlo necesitas importar rxjava2:
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'EDITAR :
Como se descubrió, el diálogo de finalización del código mostró t -> porque el parámetro en Action1.call(T t) llamó t . Podemos verlo si observamos la firma del método rx.Observable.unsafeCreate en RxJava 1.3 :
public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) { return new Observable<T>(RxJavaHooks.onCreate(f)); } La interfaz OnSubscribe amplía Action1<Subscriber<? super T> , y Action1 tiene la siguiente firma:
public interface Action1<T> extends Action { void call(T t); } Entonces, el parámetro se llama t y Android Studio lo sugiere como t -> .
En RxJava2 tenemos firma diferente:
public static <T> Observable<T> unsafeCreate(ObservableSource<T> onSubscribe) {...} public interface ObservableSource<T> { void subscribe(@NonNull Observer<? super T> observer); } Vemos que en el parámetro del método ObservableSource.subscribe() se llama observer , por lo que lo vemos como observer-> .
Conclusión : la sugerencia de IDEA se basa en el nombre del parámetro del método de interfaz funcional que está implementando como lambda.
En realidad, Intellij lo ayuda en el lado de Java pero no (todavía) en el lado de Kotlin.
El nombre del parámetro del subscriber se deriva del tipo genérico de la interfaz extendida, es decir, el Subscriber de interface OnSubscribe<T> extends Action1<Subscriber<? super T>> .
Sin embargo, en el lado de Kotlin, este mecanismo no se aplica y, por lo tanto, la finalización del código le sugiere el parámetro de la función de implementación, que en este caso es de Action1#call(T t) , así que solo t .
Puede probar que usa la información de tipo genérico simplemente haciendo un ejemplo básico:
class CustomObject {} interface MyCustomConsumer extends Consumer<CustomObject> { } static void test(MyCustomConsumer mcs) { } public static void main(String[] args) { test( // <- place cursor here and start code completion and you should get "customObject" Tenga en cuenta que para algunos tipos adapta el nombre, por ejemplo, String se convierte en s y los otros tipos en caja ( Long , Integer , etc.) están precedidos por una a (por ejemplo, aLong ; por supuesto, de lo contrario usaría una palabra reservada).
Si tiene curiosidad por lo que está sucediendo en el código fuente allí, es posible que desee revisar el código fuente de la comunidad de Intellij o, para Android Studio, es posible que desee pasar primero por Building Android Studio .
EDITAR: Debería haber agregado el código del complemento de Kotlin en su lugar ;-) si desea mejorar las sugerencias de finalización para Kotlin, puede consultar JetBrains/kotlin/idea/idea-completion . Además , JetBrains/kotlin/idea/src también podría valer la pena echarle un vistazo y probablemente terminarás mirando todos los paquetes de JetBrains/kotlin/idea ;-)