2014-03-03 40 views
0

如果我有类驱动程序和类管理器。父母和孩子的ArrayList。不抽象

经理从驱动

public class Driver { ... 

继承。

public class Manager extends Driver { ... 

我想写一个简单的登录,所以经理有一个不同的菜单来执行更多的操作。但我无法弄清楚如何将这两种类型存储在我的Depot类的ArrayList中。

public class Depot { 

public ArrayList<Driver> arrayDrivers = new ArrayList<Driver>(); 

因为显然现在添加到此数组的任何东西现在都是驱动程序,而不是适用的管理程序。

,当我尝试:

public ArrayList<? extends Driver> arrayDrivers = new ArrayList<Driver>(); 

我得到的错误:即使我改变

public Depot(ArrayList<Driver> tempDriver)  { 
    arrayDrivers.addAll(tempDriver); 
} 

ArrayList<? extends Driver> tempDriver 

谁能帮我出我不能想出解决办法。

我知道最好是创建一个抽象类的用户例如然后驱动程序和管理器,但它是课程作业,我必须按照图和说明。

编辑:

我读的地方,情况并非如此,我必须在被误导。

因此,即使当我获得像这样的指针,它仍然应该作为经理?

public boolean authenticateDriver(String username, String password, Driver driver) { 

    Driver userDriver = GetDriver(username); //Not a manager anymore? 

    if(userDriver != null) { 
     driver = userDriver; 
     return userDriver.checkPassword(password); 
    } 
    else { 
     return false; 
    } 

} 

public Driver GetDriver(String driver) { 
    for (Driver currentDriver : arrayDrivers) { 
     if (currentDriver.userName.equals(driver)) { 
      return currentDriver; 
     } 
    } 
    return null; 
} 
+1

你提到的第一个选项到底是什么问题('ArrayList arrayDrivers')? –

+0

此信息可能对您有所帮助http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java – user2793390

回答

0

创建超类对象的数组列表。每当你想声明子类对象,声明如下:

Driver driver = new Manager(...); 

同样的,当你想使用管理方法,采用铸造调用驱动程序。

顺便说一句,名字为Manager的子类(Employee类和类ManagerEmployee extends Employee)的名称可能使代码更易于阅读。我同意你—不是这个类命名系统的粉丝。

0

泛型并不完美。有时你必须降级事情才能通过编译,并知道你的代码维护合同。如果你将传递给addAll()的数组转换为原始列表,它将起作用。

public Depot(ArrayList<Driver> tempDriver)  { 
    arrayDrivers.addAll((List)tempDriver); 
} 
+0

我不认为这是必要的。 arrayDrivers是'ArrayList '。当然,'.addAll'对另一个'ArrayList '有效,比如tempDriver,没有任何强制转换。 –

1

笔者认为:

public ArrayList<Driver> arrayDrivers = new ArrayList<Driver>(); 

会工作。将管理器添加到此ArrayList时,它们不会成为驱动程序。当你调用.showMenu()或其他东西时,多态性将保证管理器的showMenu()版本被调用。

+0

我不能在这里正确回复我更新我的问题... – nicwhitts

1

Manager延伸Driver,因此,如果您构建一个ArrayList<Driver>您可以在其中存储Manager对象以及他们表现得像Manager,如适用。

这叫做,它允许你为各种类型的对象定义不同的行为,然后利用它,而不需要知道你将在运行时收到什么样的对象。

因此,您可以定义不同的.showMenu()方法DriverManager,当你得到一个对象Driver类的user并调用user.showMenu(),方法的相应版本将运行,这取决于userManagerDriver类的。

编辑:

关于你问题的第二部分,基本上,如果你有DriverManager类中定义的同样的方法,它的一个适当的版本将被调用,这取决于你的对象的类。 如果但是只有在Driver类中定义了它,则同一版本的方法将用于DriverManager对象。

如果只定义在Manager的方法,但不是在Driver,你将不能够把这种方法用于Driver类型变量,不管他们会在运行时持有什么类型的对象,因为你永远无法请确保该变量将始终包含Manager对象。

+0

我更新了我的问题 – nicwhitts

+0

我有Driver类中的isManager()方法,它只返回false。而在我的经理类中@Override返回true。但它似乎总是返回假? – nicwhitts

+0

@nicwhitts确保两个方法签名相同(参数相同,返回值相同),然后根据对象的类型得到正确的值。更多关于[方法重写](http://docs.oracle.com/javase/tutorial/java/IandI/override.html)。 – Warlord