如何获取存储在集合中的对象的特定方法?

时间:2015-12-18 23:02:39

标签: java interface

这听起来像是一个基本的东西,我无法让它发挥作用。

我们假设我需要一个存储公司所有员工的应用程序。他们做不同的事情,他们的工作价格取决于专业的具体情况。对于每个工人,我需要一个价格。

我的所作所为:

创建Worker

的界面
public interface Worker {
    int getPrice(); 
}

创建一个LanguageTranslator类,其工资取决于已翻译的文本的NumberOfLines。该类实现了Worker。当然,对于其他专业人士,我会有其他影响价格的因素。

public class LanguageTranslator implements Worker {

    private int numberOfLines;

        @Override
        public int getPrice() {
            return this.numberOfLines * 14;
        }

        public void setNumberOfLines(int numberOfLines) {
            this.numberOfLines = numberOfLines;
        }   
    }

现在,我想将所有工作者存储在List,Map或任何集合中,并且可以直接访问setNumberOfLines方法。

    public static void main(String[] args) {

        List<Worker> workers = new ArrayList<Worker>();
        Worker worker = new LanguageTranslator();
        workers.add(worker);

        //How to get to LanguageTranslator.setNumberOfLines() method?

    }
}

如果我直接去收集

workers.get(0).[only interface methods visible];

只有接口方法可用。有没有办法获得特定的LanguageTranslator方法?

我想这可能是非常糟糕的设计。我可以搜索的任何关键字?

提前致谢。

2 个答案:

答案 0 :(得分:2)

当您从列表中获取对象时,您需要转换每个对象。在您提到的评论中,您将有不同的职业,稍后将被添加。由于您不知道要将其类型化,因此您需要进行检查。

Object object = workers.get(0);
if(object instanceof LanguageTranslator) {
    LanguageTranslator lt = (LanguageTranslator) object;
    lt.setNumberOfLines(7);
}
else if(object instanceof Accountant) {
    Accountant acc = (Accountant) object;
    acc.doSomething();
}
etc...

答案 1 :(得分:1)

您必须了解LanguageTranslator类型的所有实例也属于Worker类型,但并非所有Worker类型的实例都属于LanguageTranslator类型{1}}类型。因此,您无法在所有LanguageTranslator个实例上调用Worker方法。

您可以将Worker类型的实例转换为LanguageTranslator类型,但您必须始终先检查该实例是否真的属于LanguageTranslator类型。

if(worker instanceof LanguageTranslator) {
    ((LanguageTranslator) worker).setNumberOfLines(1);
}