带有Java泛型的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的对象。在编写包时,我们需要先编写类类型,然后才编写泛型对象。阅读时,我们按照同样的顺序进行

Android AIDL支持泛型吗

例如,假设我有一个类
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());