gpt4 book ai didi

Java——如何从父类(super class)列表干净地构造子类列表?

转载 作者:行者123 更新时间:2023-12-02 07:07:18 25 4
gpt4 key购买 nike

具体来说,我有一个对象列表。该对象类的每个子类都与特定的功能相关联。

这是我对这个问题的幼稚解决方案,它很丑陋:

List<SuperClass> superClasses = ...

List<Subclass1> obj1 = Lists.newArrayList();
List<Subclass1> obj2 = Lists.newArrayList();
List<Subclass1> obj3 = Lists.newArrayList();
List<Subclass1> obj4 = Lists.newArrayList();
...

for (SuperClass obj : superClasses) {
if (obj.getClass().equals(Subclass1.class)) {
obj1.add((Subclass1) obj);
}
}

//repeat for each subclass

我也尝试过这样的事情:

public Map<Class, List<SuperClass>> constructMap(List<SuperClass> superClasses);

但这无法使用:

(List<Subclass1>) constructMap(superClasses).get(Subclass1.class)
cannot cast from List<SuperClass> to List<Subclass1>.

我注定要在这里写幼稚的代码吗?难道真的没有聪明的方法来获取父类(super class)对象列表并根据它们的实际类来处理它们吗?

<小时/>

这是我试图解决的问题:

public Driver {

List<Fruit> fruits = collectAllFruit();

StemHandler.pullStem(fruitsThatAreApples, fruitsThatArePears);
ColorHandler.getColor(fruitsThatAreApples, fruitsThatAreOranges, fruitsThatArePears);


public interface Fruit {

getColor();
}

public class Apple implements Fruit {

getColor();
pullStem();
}

public class Orange implements Fruit {

getColor();
peel();

}

public class Pear implements Fruit {

getColor();
pullStem();

}


public interface FruitHandler {


}

public class StemHandler extends FruitHandler {

pullStem(List<Apple>, List<Pear>)

}

public class ColorHandler extends FruitHandler {

getColor(List<Apple>, List<Orange>, List<Pear>)
}

最佳答案

正确的做法是使用基类型列表 ( List<SuperClass> ) 来使用多态性。您不应该在迭代不同子类的循环中以不同的方式处理它们。您应该做的是调用在父类(super class)(更好的是接口(interface))上定义的特定方法,并在每个子类中以不同的方式实现该方法(实现)。请参阅Returning an extended class

interface MyInteface{
public void doSomething();
}

class Sub1 implements MyInterface{
public void doSomething() {
System.out.println("Behavior # 1");
}
}

class Sub2 implements MyInterface{
public void doSomething() {
System.out.println("Different Behavior");
}
}

for (MyInteface obj : superClasses) {
// Will do different things for different implementations
obj.doSomething();
}

秘诀在于定义不同实现的共同点,并能够将它们全部压缩到同一个签名中。

关于Java——如何从父类(super class)列表干净地构造子类列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com