- 正确写法
- 错误写法
一、正确写法:
- 方法1:@JvmOverloads
class KoTabBottom @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {
init { }
}
对上面代码进行kotlin转java如下:
public final class KoTabBottom extends RelativeLayout {
@JvmOverloads
public KoTabBottom (@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
Intrinsics.checkNotNullParameter(context, "context");
super(context, attrs, defStyleAttr);
}
// $FF: synthetic method
public KoTabBottomLayout(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
if ((var4 & 2) != 0) {
var2 = (AttributeSet)null;
}
if ((var4 & 4) != 0) {
var3 = 0;
}
this(var1, var2, var3);
}
@JvmOverloads
public KoTabBottomLayout(@NotNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0, 4, (DefaultConstructorMarker)null);
}
@JvmOverloads
public KoTabBottomLayout(@NotNull Context context) {
this(context, (AttributeSet)null, 0, 6, (DefaultConstructorMarker)null);
}
........
}
注意:这里有一个KoTabBottomLayout(@NotNull Context context)
的构造方法,下面的错误写法中没有此构造方法。
- 方法2:
class KoTabBottom : RelativeLayout {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int)
: super(context, attrs, defStyleAttr)
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int)
: super(context, attrs, defStyleAttr, defStyleRes)
init { }
}
二、 错误写法
class KoTabBottom(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {
init { }
}
注意:这种写法会导致java.lang.NoSuchMethodException
错误,原因是在xml中创建控件需要一个context
的构造函数。
对上面代码进行kotlin转java如下:
public final class KoTabBottom extends RelativeLayout {
........
public KoTabBottom(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
Intrinsics.checkNotNullParameter(context, "context");
super(context, attrs, defStyleAttr);
}
........
// $FF: synthetic method
public KoTabBottom(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
if ((var4 & 2) != 0) {
var2 = (AttributeSet)null;
}
if ((var4 & 4) != 0) {
var3 = 0;
}
this(var1, var2, var3);
}
........
}
错误分析:kotlin转换后的java代码是没有context
的构造方法的。所以错误日志显示信息为java.lang.NoSuchMethodException
。