5

Java to Kotlin dönüştürücüsünün, yöntem argümanlarını null olarak işaretlememesinden dolayı beni sefil bir şekilde başarısızlığa uğrattığı bir durum vardı.Java to Kotlin dönüştürücü ve null yöntemi argümanları

Örnek: registerActivityLifecycleCallbacks kullanarak izleme faaliyeti yaşam döngüsü:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 
    @Override 
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} 

    @Override 
    public void onActivityStarted(Activity activity) {} 

    @Override 
    public void onActivityResumed(Activity activity) {} 

    // ... other overriden methods 
}); 

yapıştırma Kotlin sonuçlarına bu kodu:

registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { 
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle) {} 

    override fun onActivityStarted(activity: Activity) {} 

    override fun onActivityResumed(activity: Activity) {} 

    override fun onActivityPaused(activity: Activity) {} 

    // ... other overriden methods (all with non-nullable parameters) 
}) 

meselenin değer çünkü Bundle? olması gereken yerde savedInstanceState argüman türü Bundle olmasıdır null olabilir. Bir Activity örneği durumuna olmadan oluşturulduğunda aşağıdaki istisna alacak Bu durumda

:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState 

Not buna kök neden onActivityCreated documentationBundle boş olabilir söz etmediğini olabilir

// Java 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
} 
// Kotlin 
override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 
} 

sorum şu: onCreate basit dönüşüm beklendiği gibi çalıştığını neden onCreate documentation oysa açıklayabilir gelmez ki Bu tür sorunları önlemek için hangi argümanların null olması gerektiğini nasıl bilebiliriz? @Nullable ek açıklamaları burada yardımcı olmaz.

cevap

3

Ek açıklamalar yardımcı olmazsa, bir argümanın geçersiz olup olmadığını bilmenin bir yolu olduğunu sanmıyorum. (Application.java bakınız): değildir

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    final AppCompatDelegate delegate = getDelegate(); 
    delegate.installViewFactory(); 
    delegate.onCreate(savedInstanceState); 
    . 
    . 

ActivityLifecycleCallbacks iken arayüz yöntemleri : onCreate@Nullable olarak işaretlenmiş IS

Aktivite: En yayınlanan kod İlişkin

, ben neler biliyorum

public interface ActivityLifecycleCallbacks { 
    void onActivityCreated(Activity activity, Bundle savedInstanceState); 
    void onActivityStarted(Activity activity); 
    void onActivityResumed(Activity activity); 
    void onActivityPaused(Activity activity); 
    void onActivityStopped(Activity activity); 
    void onActivitySaveInstanceState(Activity activity, Bundle outState); 
    void onActivityDestroyed(Activity activity); 
} 

Görünüşe göre, Kotlin çeviricisi ek açıklamaları işliyor, ancak varsayılan olarak Non-Null'u kullanarak, benim düşünceme göre olağan olmayan bir durumdur, çünkü açıklanmayan parametreler için daha anlamlı bir anlam ifade eden Nullable. Bununla birlikte, geliştiricilerin çevrilmiş kodlara dikkat etmesini ve bir parametrenin Nullable içerip içermediğine karar vermek için bu kararı anlayabiliyorum. Bu arada

, zihin (ama sadece bir tahmin)

Ben Kotlin çevirmen sadece bazıları tanırsa sürpriz olmaz @NonNull ve @Nullable açıklamalar (javax, android, jetbrains ...) çeşitli olduğunu

Ayrıca, kodunuzla ilgili olarak, Java Lint, notlandırılmış parametreler içeren bir yöntemi geçersiz kıldığınızı ve bunları açıklamamış olduğunuzu söyleyerek, geçersiz kılınan onCreate hakkındaki bir uyarı vermelidir.

+1

Bu sizin argümanınızı desteklediğini tahmin ediyorum: https://kotlinlang.org/docs/reference/java-interop.html # nullability-ek açıklamalar. Bir ek açıklamayla bir kez daha dönüştürmeyi deneyeceğim (daha önce benim için çalışmadı) –

+1

Evet, Kotlin, ek açıklama içermediği sürece Java kodunun varsayılan olarak boş olmadığını varsayar. Kodun Java'dan geldiğini size söylemek için 'dize 'gibi Java kodu için'! 'Kullanın. – Joshua

İlgili konular