- 正確寫法
- 錯(cuò)誤寫法
一、正確寫法:
- 方法1:@JvmOverloads
class KoTabBottom @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {
init { }
}
對(duì)上面代碼進(jìn)行kotlin轉(zhuǎn)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);
}
........
}
注意:這里有一個(gè)KoTabBottomLayout(@NotNull Context context)的構(gòu)造方法,下面的錯(cuò)誤寫法中沒(méi)有此構(gòu)造方法。
- 方法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 { }
}
二、 錯(cuò)誤寫法
class KoTabBottom(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {
init { }
}
注意:這種寫法會(huì)導(dǎo)致java.lang.NoSuchMethodException錯(cuò)誤,原因是在xml中創(chuàng)建控件需要一個(gè)context的構(gòu)造函數(shù)。
對(duì)上面代碼進(jìn)行kotlin轉(zhuǎn)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);
}
........
}
錯(cuò)誤分析:kotlin轉(zhuǎn)換后的java代碼是沒(méi)有context的構(gòu)造方法的。所以錯(cuò)誤日志顯示信息為java.lang.NoSuchMethodException。