我在Oracle的网站上读到了Java的类型擦除.
什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?
很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?
考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.
public class A {
public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)
现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.java与A.class在类路径中,javac的是足够聪明,引发警告.所以A.class 有一些类型信息存储在其中.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: …Run Code Online (Sandbox Code Playgroud) 这是一个一般的JAVA问题.在android中,有一个接口Parcelable:
这是官方文档中的一个示例:
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
Run Code Online (Sandbox Code Playgroud)
我们需要实现2个功能describeContents()和writeToParcel.
(问题)
除了它们之外,我们还需要将Parcelable.Creator<T>接口实现为名为CREATOR的静态字段.
一切都是直截了当的.现在我想创建一个具有Parcelable类类型的Generic Class:
public …Run Code Online (Sandbox Code Playgroud) 我有一个后端,它总是会返回带有一些数据的“成功”,因为在 json 字段中,字段将被命名为成功并在其中包含数据。或者它会以 json 格式返回一个错误对象。所以我想要某种 BaseResponse,所以当我使用它时,我可以做一些类似 BaseResponse 的事情,这样成功就会被映射为一个 Person 对象。
所以我想这样做:
@Parcelize
data class BaseResponse<T>(
val success: T? = null
) : Parcelable
Run Code Online (Sandbox Code Playgroud)
但它说 Parcelize 不直接支持 Type。有什么办法可以做到这一点吗?还是我需要写一些自定义的东西?使用 Retrofit 和 Gson 作为序列化程序调用调用等。