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

创建通用函数以复制不同的对象

  •  3
  • NoobEditor  · 技术社区  · 6 年前

    所以我有一个我需要的用例 复制 object 属于 class ES(等级可能因工厂输入类型而异。

    这是我想做的事情的一个例子

    public interface DataUtil {
    
        // the main wrapper 
        static Object copyObject(Object payload){
            if(payload instanceof Human))
                return copyEntry((Human) payload);
            if(payload instanceof Car))
                return copyEntry((Car) payload);
            if(payload instanceof Planet))
                return copyEntry((Planet) payload);        
            return payload;
        }
    
        static Human copyEntry(Human human) {
            return Human.builder()
                    .name(human.getName())
                    .age(human.getAge())
                    .build();
        }
    
        static Car copyEntry(Car car) {
            return Car.builder()
                    .model(car.getModel())
                    .brand(car.getBrand())
                    .build();
        }
    
        static Planet copyEntry(Planet planet) {
            // return builder like previous
        }
    }
    

    如果你看 copyObject 函数,它按预期执行作业,但问题属于返回类型。目前,为了使自己 兼容的 ,它返回一个 Object 但是我宁愿返回它特定的类对象(比如 Human Car 例如)

    有没有办法用仿制药(用 <T> )?或者这是一个糟糕的方法在第一个地方做?

    3 回复  |  直到 6 年前
        1
  •  6
  •   NoobEditor    6 年前

    Object
    instanceof

    public interface Copyable<T> {
        T copy(T t);
    }
    

    public class Human implements Copyable<Human> {
    
       @Override
       public Human copy(Human t) {
           return    Human.builder()
                         .name(human.getName())
                         .age(human.getAge())
                         .build();
       }
    
    }
    

    // the main wrapper
    static <T extends Copyable<T>> T copyObject(T payload) {
        return payload.copy(payload);
    }
    

    Human human = new Human();
    // set some fields  ...
    Human copiedHuman = copyObject(human); // compile
    Car copiedCar = copyObject(human); // doesn't compile
    


    copyObject() CopyVisitor

    @SuppressWarnings("unchecked")
    static <T extends Visited> T copyObject(T payload) {
        CopyVisitor visitor = new CopyVisitor();
        payload.accept(visitor);
        return (T) visitor.getCopy();
    }
    

    Visitor

    public interface Visitor {  
        void visitHuman(Human human);
        void visitCar(Car car);
        void visitPlanet(Planet planet);
    }
    

    public class CopyVisitor implements Visitor {
    
        private Visited copy;
    
        @Override
        public void visitHuman(Human human) {
            copy = Human.builder()
                        .name(human.getName())
                        .age(human.getAge())
                        .build();
    
        }
    
        @Override
        public void visitCar(Car car) {
            copy = Car.builder()
                      .model(car.getModel())
                      .brand(car.getBrand())
                      .build();
        }
    
        @Override
        public void visitPlanet(Planet planet) {
            //...
        }
    
        public Visited getCopy() {
            return copy;
        }
    
    }
    

    public interface Visited {
        void accept(Visitor visitor);
    }
    

    public class Human implements Visited {
    
        @Override
        public void accept(Visitor visitor) {
            visitor.visitHuman(this);
        }
    
    }
    

    copy()

        2
  •  1
  •   Alexander Egger    6 年前

    static <TPayload> TPayload copyObject(Object payload) {
        if (payload instanceof Human)
            return (TPayload) copyEntry((Human) payload);
        if (payload instanceof Car)
            return (TPayload) copyEntry((Car) payload);
        if (payload instanceof Planet)
            return (TPayload) copyEntry((Planet) payload);
        return (TPayload) payload;
    }
    

    Number n = DataUtil.copyObject("someString");
    
        3
  •  0
  •   iconfly    6 年前

    static <T> T copyObject(Object payload)
        {
            if (payload instanceof Human)
            {
                return (T) copyEntry((Human) payload);
            }
            if (payload instanceof Car)
            {
                return (T) copyEntry((Car) payload);
            }
            if (payload instanceof Planet)
            {
                return (T) copyEntry((Planet) payload);
            }
            return (T) payload;
        };
    

    Human h1 = new ...
    Human h2= copyObject(h1);
    

    List<Object>