带有Java泛型的Android AIDL
Android AIDL支持泛型吗 例如,假设我有一个类带有Java泛型的Android AIDL,java,android,generics,aidl,Java,Android,Generics,Aidl,Android AIDL支持泛型吗 例如,假设我有一个类Result,其中T可以是任何类型,包括原语(通过自动装箱)或其他自定义类,如Car。根据活页夹的要求,任何自定义类都实现了可包裹 那么可能的AIDL方法签名将是 Result m1() Result m2() Result m3() 据我所知,AIDL编译器不喜欢结果之类的东西 在Result中,我们不仅存储类型为T的对象,还存储类型为Class的对象。在编写包时,我们需要先编写类类型,然后才编写泛型对象。阅读时,我们按照同样的顺序进行
Result
,其中T可以是任何类型,包括原语(通过自动装箱)或其他自定义类,如Car
。根据活页夹的要求,任何自定义类都实现了可包裹
那么可能的AIDL方法签名将是
Result m1()代码>
Result m2()代码>
Result m3()代码>
据我所知,AIDL编译器不喜欢结果之类的东西
在Result
中,我们不仅存储类型为T
的对象,还存储类型为Class
的对象。在编写包时,我们需要先编写类类型,然后才编写泛型对象。阅读时,我们按照同样的顺序进行。我们需要编写类类型,因为当我们读取时,我们必须在.readValue(classType.getClassLoader())中执行t=(t)代码>并且如果没有类类型,我们将选择要获取的类装入器。可能还有其他方法可以做到这一点,但在本例中我就是这样做的
在客户端节点上接收时,我可以成功地执行结果。Daniels解决方案几乎对我有效,除了编组和解编组类类型。
在.readValue(Class.Class.getClassLoader());“
中,我不得不使用”dest.writeValue(classType);“
和中的this.classType=(Class);”
而不是“.readValue(Class.Class.getClassLoader());”;“
我必须使用”dest.writeSerializable(classType);“
,它工作起来很有魅力
谢谢Daniel“Android AIDL支持泛型吗?”——我不知道,因为AIDL是跨语言的,不特定于Java,我也不知道C/C++将如何使用您想要的方法。如果Result
是Parcelable
,则可能有Result m()不过,代码>。嗨,Daniel,是否可以为上述实现提供链接或共享代码。很抱歉,我无法完全实现您的方法。提前谢谢!!您真的需要传递类类型吗?看起来你们只是用它来获取类加载器。谢谢你们Teodor和Daniel:)你们救了我一天!
public class Result<T extends Parcelable> implements Parcelable {
private String msg;
private Class classType;
private T value;
public Result(String msg, T value, Class classType) {
this.msg = msg;
this.value = value;
this.classType = classType;
}
// to reconstruct object
public Result(Parcel in) {
readFromParcel(in);
}
public String getMsg() {
return msg;
}
public T getValue() {
return value;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(msg);
dest.writeValue(classType);
dest.writeValue(value);
}
private void readFromParcel(Parcel in) {
this.msg = in.readString();
this.classType = (Class) in.readValue(Class.class.getClassLoader());
this.value = (T) in.readValue(classType.getClassLoader());
}
public static final Creator<Result> CREATOR = new Creator<Result>() {
@Override
public Result createFromParcel(Parcel source) {
return new Result(source);
}
@Override
public Result[] newArray(int size) {
return new Result[size];
}
};
}
public class Animal implements Parcelable {
private int n;
public Animal(int n) {
this.n = n;
}
public Animal(Parcel in) {
readFromParcel(in);
}
public int getN() {
return n;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(n);
}
private void readFromParcel(Parcel in) {
n = in.readInt();
}
public static final Creator<Animal> CREATOR = new Creator<Animal>() {
@Override
public Animal createFromParcel(Parcel source) {
return new Animal(source);
}
@Override
public Animal[] newArray(int size) {
return new Animal[size];
}
};
}
@Override
public Result getResult() throws RemoteException {
Result<Animal> r = new Result<Animal>("this is an animal", new Animal(42), Animal.class);
return r;
}
Result<Animal> r = MainActivity.this.service.getResult();
Log.d(TAG, "Received the following (Outer): " + r.getMsg());
Log.d(TAG, "Received the following (Inner): " + r.getValue().getN());