[英]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 課程注入大量知識。 你應該去吃
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.