Fil*_*ixo 4 java generics arraylist
我是Java的新手,甚至是Java中的泛型.我找了类似的问题,但没有找到我特定问题的简单答案.
我正在开发一个项目来管理病人,医生,咨询,医疗活动以及与医疗诊所相关的所有事情.我现在要做的是创建一个与每位患者相关的医疗事件清单.对于这个医疗事件列表,目前只允许添加考试和处方,但它应该是可扩展的:如果我需要,我希望将来能够添加其他类型的医疗事件,有关手术的信息.
因此,我首先在Patient类中创建一个通用ArrayLists的ArrayList,其类型有限,由MedicalEvent类扩展(因此,现在,它是Prescription或Exam类型的ArrayLists的ArrayList).我还创建了一个Prescription类型的ArrayList和另一个类型Exam.
List<ArrayList<? extends MedicalEvent>> medicalevents;
private ArrayList<Prescription> prescriptions;
private ArrayList<Exam> exams;
然后,在构造函数中,我将ArrayLists处方和检查添加到ArrayList医疗事件中.
medicalevents.add(prescriptions);
medicalevents.add(exams);
要添加两种允许类型之一的医疗事件,我定义了以下方法:
public void addMedicalEvent(E element){
if(element instanceof Prescription){
medicalevents.get(0).add((Prescription)element);
}
if(element instanceof Exam){
medicalevents.get(1).add((Exam)element);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我得到错误"方法添加(捕获#1-of?extends MedicalEvent)类型ArrayList不适用于参数(处方)",我不知道它的含义.任何人都可以告诉我我做错了什么,或建议更好的方法来解决这个问题?
谢谢!
给出以下声明
class A {}
class B extends A {}
class C extends A {}
public class SOSample {
public static void main(String[] args) {
List<List<? extends A>> list = new ArrayList<List<? extends A>>();
final List<? extends A> as = list.get(0);
as.add(new B()); // error here
}
}
Run Code Online (Sandbox Code Playgroud)
你不能添加B
到as
,因为它会在以后造成的问题,当你试图从名单如下:
A a = list.get(0).get(0); // is a B or C?
Run Code Online (Sandbox Code Playgroud)
为了更好地理解这个问题,有一个有趣的例子:
class Vehicle { void launch(); }
class Car extends Vehicle {}
class NuclearMissile extends Vehicle {}
...
// this is prohibited because of below code
List<? extends Vehicle> cars = new ...
// imagine this is possible...
cars.add(new NuclearMissile());
// now this is possible
cars.get(0).launch();
Run Code Online (Sandbox Code Playgroud)
通常,具有有界通配符的集合List<? extends Something>
对于不会修改集合的代码很有用,但只是迭代它对元素执行某些操作.
关于您的原始问题 - 您可以更改代码,因此有两个不同的列表,一个用于Prescription
,另一个用于Exam
.您仍然可以只使用一种方法迭代这两个列表,执行一些有用的操作(比如打印它们的内容):
void doSomethingWithEvents(List<? extends Event> events) {
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1948 次 |
最近记录: |