簡體   English   中英

創建泛型類以傳遞泛型類型(對象或列表)

[英]Creating generic class to pass an generic type (Object or List)

我正在嘗試解決一個問題,我必須創建一個將對象或對象列表作為泛型類型的類。 我不想創建多個類,因為我有所有其他領域的共同點。

這是我所做的,但我不確定從長遠來看它是否安全。

主課。

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是否有其他更好的方法來做到這一點?

簡單地說:壞主意。

單個實例可以很容易地表示為一個包含一個條目的列表。 甚至還有Collections.singletonList()庫方法可以將單個對象轉換為列表。

您將要發明一個復雜的設計,為 Rat 課程注入大量知識。 你應該去吃

  • Animal接口或基類(用於 Cat/Dog 中的常用方法)
  • 只需讓Rat類然后使用List<Animal> ,或者List<? extends Animal> List<? extends Animal>

意思是:您過度專業化了您的 Rat 課程。 說真的:不允許“單個對象”和列表。 只需使用列表,並且(如果有的話)區分該列表中元素的數量。 你的方法過於復雜,會讓你的讀者大吃一驚(以一種糟糕的方式)。 不要那樣做。

對於您提供的示例,您應該提供一個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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM