父母和孩子的ArrayList。不抽象
如果我有类驱动程序和类管理器。父母和孩子的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;
}
创建超类对象的数组列表。每当你想声明子类对象,声明如下:
Driver driver = new Manager(...);
同样的,当你想使用管理方法,采用铸造调用驱动程序。
顺便说一句,名字为Manager的子类(Employee类和类ManagerEmployee extends Employee)的名称可能使代码更易于阅读。我同意你—不是这个类命名系统的粉丝。
泛型并不完美。有时你必须降级事情才能通过编译,并知道你的代码维护合同。如果你将传递给addAll()的数组转换为原始列表,它将起作用。
public Depot(ArrayList<Driver> tempDriver) {
arrayDrivers.addAll((List)tempDriver);
}
我不认为这是必要的。 arrayDrivers是'ArrayList
笔者认为:
public ArrayList<Driver> arrayDrivers = new ArrayList<Driver>();
会工作。将管理器添加到此ArrayList时,它们不会成为驱动程序。当你调用.showMenu()或其他东西时,多态性将保证管理器的showMenu()版本被调用。
我不能在这里正确回复我更新我的问题... – nicwhitts
Manager
延伸Driver
,因此,如果您构建一个ArrayList<Driver>
您可以在其中存储Manager
对象以及他们将表现得像Manager
,如适用。
这叫做,它允许你为各种类型的对象定义不同的行为,然后利用它,而不需要知道你将在运行时收到什么样的对象。
因此,您可以定义不同的.showMenu()
方法Driver
和Manager
,当你得到一个对象Driver
类的user
并调用user.showMenu()
,方法的相应版本将运行,这取决于user
是Manager
或Driver
类的。
编辑:
关于你问题的第二部分,基本上是,如果你有Driver
和Manager
类中定义的同样的方法,它的一个适当的版本将被调用,这取决于你的对象的类。 如果但是只有在Driver
类中定义了它,则同一版本的方法将用于Driver
和Manager
对象。
如果只定义在Manager
的方法,但不是在Driver
,你将不能够把这种方法用于Driver
类型变量,不管他们会在运行时持有什么类型的对象,因为你永远无法请确保该变量将始终包含Manager
对象。
你提到的第一个选项到底是什么问题('ArrayList arrayDrivers')? –
此信息可能对您有所帮助http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java – user2793390