这听起来像是一个基本的东西,我无法让它发挥作用。
我们假设我需要一个存储公司所有员工的应用程序。他们做不同的事情,他们的工作价格取决于专业的具体情况。对于每个工人,我需要一个价格。
我的所作所为:
创建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方法?
我想这可能是非常糟糕的设计。我可以搜索的任何关键字?
提前致谢。
答案 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);
}