代码之家  ›  专栏  ›  技术社区  ›  Shafqat Shafi

创建泛型类以传递泛型类型(对象或列表)

  •  2
  • Shafqat Shafi  · 技术社区  · 7 年前

    这是我所做的,但我不确定它是否长期安全。

    public class TestGeneric{
    
        public static void main(String[] args) {
    
            List<Cat> cats = new ArrayList<>();
            cats.add(new Cat("Tom"));
            cats.add(new Cat("Jerry"));
            cats.add(new Cat("Billi"));
    
            Dog dog = new Dog("Bow");
    
            new Rat<>(cats).instOf();
            System.out.println();
            new Rat<>(dog).instOf();
        }
    }
    

    在泛型类中,我要在泛型对象中传递一个列表或单个对象。

    class Rat<T> {
        private T obj ;
    
        public Rat(T t) {
            this.obj = t;
        }
    
        public void instOf() {
            if(obj instanceof Dog) {
                System.out.println((obj.getClass()).getName());
            }
            if(obj instanceof Cat) {
                System.out.println("Instance of Cat");
            }
            if(obj instanceof List) {
                for(Object object : ((List) obj).toArray()) {
                    System.out.println(((Cat)object).getName());
                }
            }
        }
    }
    

    类作为单个对象或列表传递。

    class Dog {
        private String name;
    
        public Dog() {}
    
        public Dog(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Dog [name=" + name + "]";
        }
    
    }
    

    作为单个对象或列表传递的另一个类。

    class Cat {
        private String name;
    
        public Cat() {}
    
        public Cat(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Dog [name=" + name + "]";
        }   
    }
    

    OR 还有其他更好的方法吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   GhostCat    7 年前

    简单地说:坏主意。

    容易地 Collections.singletonList() 库方法将单个对象转换为列表。

    你将要发明一个复杂的设计,把大量的知识放进那只老鼠的课堂。你应该去吃点东西

    • 动物
    • 只要有 Rat List<Animal> ,或者 List<? extends Animal>

    意思是:你的老鼠课太专业化了。严肃地说:不允许“单一对象”和列表。只需使用列表,并且(如果有的话)根据列表中元素的数量进行区分。你的方法过于复杂,会让你的读者大吃一惊。别那么做。

        2
  •  0
  •   Andy Turner    7 年前

    Consumer<T> ,根据类型执行您要执行的“任务”:

    class Rat<T> {
        private T obj ;
        private Consumer<T> consumer;
    
        public Rat(T t, Consumer<T> consumer) {
            this.obj = t;
        }
    
        public void instOf() {
          consumer.accept(obj);
        }
    }
    

    Consumer 实例。

    当然,这是假设你需要 obj Rat 类;如果不是,只需丢弃泛型并传递 Runnable

    class Rat {
        private Runnable r;
    
        public Rat(Runnable r) {
            this.r = r;
        }
    
        public void instOf() {
          r.run();
        }
    }