代码之家  ›  专栏  ›  技术社区  ›  miversen33

如何设置有限的泛型返回类型

  •  0
  • miversen33  · 技术社区  · 7 年前

    以下面的两个对象为例,我不知道如何使下面的工作。

    public final *Generic SubType* getInfo(){
    ...
    }
    

    首先是和我一起工作的班级

    public class ResultEntry<Type extends ResultType>{
    
        private final Type mType;
        private final String mLabel;
        private final String mInfo;
    
        private ResultEntry(final Type t, final String label, final String info){
            mType = t;
            mLabel = label;
            mInfo = info;
        }
    
        public static ResultEntry<ResultType> newInstance(final String label, final Number info){
            return new ResultEntry<>(ResultType.NUMBER, label, info.toString());
        }
    
        public static ResultEntry<ResultType> newInstance(final String label, final Boolean info){
            return new ResultEntry<>(ResultType.NUMBER, label, info.toString());
        }
    
        public static ResultEntry<ResultType> newInstance(final String label, final String info){
            return new ResultEntry<>(ResultType.NUMBER, label, info);
        }
    
        public final ResultType getType(){
            return mType;
        }
    
        public final String getLabel(){
            return mLabel;
        }
    
        public final *Generic SybType* getInfo(){
    
        }
    
    }
    

    然后是枚举结果类型

    public enum ResultType {
    
        STRING  ("STRING"),
        BOOLEAN ("BOOLEAN"),
        NUMBER  ("NUMBER");
    
        private final String s;
    
        ResultType(final String string){
            s = string;
        }
    
        public final boolean isString(){
            return s.equals(STRING.s);
        }
    
        public final boolean isBoolean(){
            return s.equals(BOOLEAN.s);
        }
    
        public final boolean isNumber(){
            return s.equals(NUMBER.s);
        }
    }
    

    public final *Generic SubType* getInfo(){
        if(mType.isString()) return new String();
        if(mType.isNumber()) return new Number();
        if(mType.isBoolean()) return new Boolean();
    }
    

    不过很明显我会把实际的信息传回去。

    AsyncTask

    作为参考,我从 This Question

    1 回复  |  直到 7 年前
        1
  •  1
  •   Andreas dfa    7 年前

    我建议你这样做,这并不能改变 info 字符串的值,即。 mInfo Object ,不是 String .

    public class ResultEntry<R> {
    
        private final ResultType mType;
        private final String mLabel;
        private final Object mInfo;
    
        private ResultEntry(final ResultType t, final String label, final Object info) {
            this.mType = t;
            this.mLabel = label;
            this.mInfo = info;
        }
    
        public static ResultEntry<Number> newInstance(final String label, final Number info) {
            return new ResultEntry<>(ResultType.NUMBER, label, info);
        }
    
        public static ResultEntry<Boolean> newInstance(final String label, final Boolean info) {
            return new ResultEntry<>(ResultType.BOOLEAN, label, info);
        }
    
        public static ResultEntry<String> newInstance(final String label, final String info) {
            return new ResultEntry<>(ResultType.STRING, label, info);
        }
    
        public final ResultType getType() {
            return this.mType;
        }
    
        public final String getLabel() {
            return this.mLabel;
        }
    
        @SuppressWarnings("unchecked")
        public final R getInfo() {
            return (R) this.mInfo;
        }
    
    }
    

    ResultEntry<Number>  numEntry  = ResultEntry.newInstance("", 5);
    ResultEntry<Boolean> boolEntry = ResultEntry.newInstance("", true);
    ResultEntry<String>  strEntry  = ResultEntry.newInstance("", "Foo");
    
    Number  numInfo  = numEntry.getInfo();
    Boolean boolInfo = boolEntry.getInfo();
    String  strInfo  = strEntry.getInfo();