Java 为什么kotlin没有按照android的要求为片段创建所需的空公共构造函数?

Java 为什么kotlin没有按照android的要求为片段创建所需的空公共构造函数?,java,android,kotlin,android-fragments,bytecode,Java,Android,Kotlin,Android Fragments,Bytecode,例如: 在示例Android Studio项目中创建此文件: 现在将其复制到一个kotlin文件,并让它转换为kotlin import androidx.fragment.app.Fragment; public class TestJavaFragment extends Fragment { public TestJavaFragment() { // Required empty public constructor!!! } } Kotlin转换代

例如: 在示例Android Studio项目中创建此文件: 现在将其复制到一个kotlin文件,并让它转换为kotlin

import androidx.fragment.app.Fragment;

public class TestJavaFragment extends Fragment {

    public TestJavaFragment() {
        // Required empty public constructor!!!
    }
}
Kotlin转换代码:

import androidx.fragment.app.Fragment

class TestJavaFragment : Fragment()
工具>代码>显示Kotlin字节码>反编译。结果是,android片段没有所需的空公共构造函数:

public final class TestJavaFragment extends Fragment {
   private HashMap _$_findViewCache;

   public View _$_findCachedViewById(int var1) {
      if (this._$_findViewCache == null) {
         this._$_findViewCache = new HashMap();
      }

      View var2 = (View)this._$_findViewCache.get(var1);
      if (var2 == null) {
         View var10000 = this.getView();
         if (var10000 == null) {
            return null;
         }

         var2 = var10000.findViewById(var1);
         this._$_findViewCache.put(var1, var2);
      }

      return var2;
   }

   public void _$_clearFindViewByIdCache() {
      if (this._$_findViewCache != null) {
         this._$_findViewCache.clear();
      }

   }

   // $FF: synthetic method
   public void onDestroyView() {
      super.onDestroyView();
      this._$_clearFindViewByIdCache();
   }
}
这使得一些设备崩溃,正如crashytics中显示的那样:

致命异常:java.lang.RuntimeException无法启动活动 ComponentInfo{.activity.launching.the.fragment}: androidx.fragment.app.fragment$InstanceionException:无法 在BoardingPage上实例化片段:找不到片段 建造师

还尝试了一个静态newInstance,它使用活动中的参数创建片段,在某些设备上也会崩溃

到底发生了什么,我错过了什么


谢谢。

如果没有其他构造函数,将声明一个默认(空)构造函数。如果您定义了另一个构造函数,则不会创建默认构造函数,这可能是您的问题。Nicolas,那么为什么我在反编译的kotlin字节码中看不到默认的空构造函数?但是您有其他构造函数吗?如果是这样,那么您就看不到它,因为它不存在。可能是您正在使用的反编译器在没有其他构造函数的情况下不显示默认构造函数,这对于Java反编译器来说是合理的。事实上,每个JVM类都有一个构造函数,因此如果您在反编译代码中没有看到构造函数,这意味着它有默认构造函数。如果您的Kotlin类看起来像
类名:…
类名():…
而不是
类名(someArgs):…
,并且里面没有关键字
构造函数
,它应该具有所需的默认公共构造函数,您需要提供更多信息来解释该问题。