【问题标题】:java ArrayList extendsjava ArrayList 扩展
【发布时间】:2017-10-08 07:29:22
【问题描述】:

我有以下扩展类和 ArrayList 字段:

class Fruit { }

class Banana extends Fruit { }

class FruitVendor {
 ArrayList<Fruit> fruits;
}

class BananaVendor extends FruitVendor {
  ArrayList<Banana> fruits;
}

我正在尝试为处理水果的 FruitVendor 声明方法。对于 FruitVendor 我希望它处理水果水果,而对于 BananaVendor 我希望它处理香蕉水果。我尝试了几种方法,但到目前为止我总是以错误告终。

有哪些可能性/替代方案?

【问题讨论】:

  • 你是什么意思,不清楚你试图归档什么!!?
  • 提示,尽可能使用接口,即List&lt;Banana&gt; 而不是ArrayList&lt;Banana&gt;
  • 感谢您的提示,会的!
  • 您的要求不清楚。您的问题标题“java ArrayList extends”与您的要求不符。尝试具体描述您的需求。

标签: java arraylist extends


【解决方案1】:

如果您希望多个水果供应商以不同方式处理他们的水果,您可以使用抽象方法 handleFruitsFruitVendor 设为抽象类,然后在您的实际水果供应商中实现该方法

水果供应商

public abstract class FruitVendor {

    List<Fruit> fruits;

    public abstract void handleFruits(); 

}

香蕉供应商

public class BananaVendor extends FruitVendor {

    List<Banana> fruits;

    @Override
    public void handleFruits() {
        // do something with bananas
    }

}

【讨论】:

  • 不要用非泛型的FruitVendorBananaVendor 代替Vendor&lt;T extends Fruit&gt;
  • 别告诉我我不能做什么
  • 我的目标是不必将 handleFruits() 复制/粘贴到 BananaVendor、AppleVendor、MangoVendor 等。我希望所有这些类都可以重用 FruitVendor 的 handleFruits() 并影响他们自己的 List、List 和 List.
【解决方案2】:

也许使用泛型:

public class FruitApp {

    class Fruit {
        public String toString() {
            return "fruit";
        }
    }

    class Banana extends Fruit {
        public String toString() {
            return "banana";
        }
    }

    class Vendor<T extends Fruit> {
        List<T> fruits;

        Vendor() {
            fruits = new ArrayList<T>();
        }

        void doSomethingWithMyFruit() {
            for (Fruit fruit : fruits) {
                System.out.println("I'm a " + fruit.toString());
            }
        }
    }

    public static void main(String[] args) {
        FruitApp app = new FruitApp();
        app.createVendors();
    }

    private void createVendors() {
        Vendor<Fruit> vendor1 = new Vendor<Fruit>();
        vendor1.fruits.add(new Fruit());
        vendor1.fruits.add(new Banana());
        vendor1.doSomethingWithMyFruit();

        Vendor<Banana> vendor2 = new Vendor<Banana>();
        // vendor2.fruits.add(new Fruit()); compile error
        vendor2.fruits.add(new Banana());
        vendor2.doSomethingWithMyFruit();
    }

}

哪个输出:

I'm a fruit
I'm a banana
I'm a banana

当然,这假设doSomethingWithMyFruit() 对于所有类型的Fruit 都是相同的。如果不是这样,则可能与decorator pattern 结合使用。

【讨论】:

  • 我觉得这很接近,但我还希望 BananaVendor、AppleVendor 和 MangoVender 除了共享相同的 doSomethingWithMyFruit() 之外,还有单独的单独方法,例如 makeBananaPie() 或 makeAppleSauce()。它不希望 AppleVendor 有权访问 makeBananaPie()。
【解决方案3】:

我得到了我想要的东西:

class FruitVendor {
    List<Fruit> fruits = new ArrayList<Fruit>();

    void eatFruit() { 
       Fruit fruit = fruits.get(0);
       fruit.eat();
    }
}

class BananaVendor extends FruitVendor {
    void addBanana() { 
        fruits.add(new Banana());
    }

    void makeBananaPie() { 
        Banana banana = (Banana) fruits.get(0);
        banana.useInBananaPie();
    }
}

我认为这可能只是因为我可以通过设计保证 BananaVendor 只会将香蕉添加到水果中。

我很想知道是否有人能看到这种方法的问题?

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 2012-12-19
    • 2012-06-25
    • 2018-05-16
    • 2015-04-29
    • 2015-12-05
    • 2015-10-14
    • 2013-09-10
    • 2018-11-17
    相关资源
    最近更新 更多