假如我们要在 Bundle 中传递一个实现了 functional interface 的实例,我们可以这样扩展或者定义一个接口:
interface Parser<E> : Parcelable where E : Enum<E>, E : LogParser<E> {
fun parseLine(line: String): CharSequence
}
这个接口的泛型参数 E 定义的很巧妙: 首先,E : Parser<E>,这是一个自限定类型的写法,这里使得 E 必须是 Parser 的实现类它本身! 其次,E : Enum<E>,这里也是一个自限定类型的写法,这里使得 E 又必须是 Enum(枚举类) 的实现类它本身!
从整体上看,Parser 的实现类必须继承了 Enum 类,也就是说必须是一个枚举类,然后还要实现 LogParser 接口,最后还得实现 Parcelable 接口。
以下是一种实现:
@Parcelize
enum class DEFAULT : Parser<DEFAULT> {
INSTANCE {
override fun parseLine(line: String): CharSequence {
return line
}
};
}
其中 @Parcelize 用的是 kotlinx.parcelize.Parcelize 注解类,编译期生成的代码类似以下:
public enum DEFAULT implements Parser<DEFAULT> {
INSTANCE {
@NotNull
public CharSequence parseLine(@NotNull String line) {
return line;
}
};
public int describeContents() {
return 0;
}
public void writeToParcel(@NotNull Parcel out, int flags) {
out.writeString(this.name());
}
@NotNull
public static final android.os.Parcelable.Creator CREATOR;
static {
final class Creator implements android.os.Parcelable.Creator {
@NotNull
public final Parser.DEFAULT[] newArray(int size) {
return new Parser.DEFAULT[size];
}
@NotNull
public final Parser.DEFAULT createFromParcel(@NotNull Parcel parcel) {
return Parser.DEFAULT.valueOf(parcel.readString());
}
public Object[] newArray(int size) {
return this.newArray(size);
}
public Object createFromParcel(Parcel source) {
return this.createFromParcel(source);
}
}
CREATOR = (android.os.Parcelable.Creator)(new Creator());
}
这样,Parser 就实现了 Parcelable 接口,可以在进城内通过 Bundle 传递实例了。
|