Java 如何访问通用ArrayList的ArrayList中的对象

Java 如何访问通用ArrayList的ArrayList中的对象,java,generics,arraylist,Java,Generics,Arraylist,我对Java是新手,甚至对Java中的泛型都是新手。我一直在寻找类似的问题,但对于我的特定问题没有找到直接的答案 我正在开发一个项目来管理病人、医生、咨询、医疗事件以及所有与医疗诊所相关的东西。 我现在要做的是创建一个与每个患者相关的医疗事件列表。在这个医疗事件列表中,目前只允许添加检查和处方,但它应该是可扩展的:如果需要,我希望将来能够添加其他类型的医疗事件,例如手术信息 因此,我首先在类Patient中创建了一个通用ArrayList的ArrayList,其类型由类MedicalEvent进

我对Java是新手,甚至对Java中的泛型都是新手。我一直在寻找类似的问题,但对于我的特定问题没有找到直接的答案

我正在开发一个项目来管理病人、医生、咨询、医疗事件以及所有与医疗诊所相关的东西。 我现在要做的是创建一个与每个患者相关的医疗事件列表。在这个医疗事件列表中,目前只允许添加检查和处方,但它应该是可扩展的:如果需要,我希望将来能够添加其他类型的医疗事件,例如手术信息

因此,我首先在类Patient中创建了一个通用ArrayList的ArrayList,其类型由类MedicalEvent进行扩展(因此,现在,它是一个ArrayList的ArrayList,其类型为处方或检查)。我还创建了一个类型处方列表和另一个类型检查列表


List给出了以下声明

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
    }
}
为了更好地理解这个问题,有一个有趣的例子:

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();

有什么东西比这更好吗

class Medical {
    List<EventList<?>> eventLists = new ArrayList<EventList<?>>();

    Medical() {
        eventLists.add(new EventList<Perscription>(Perscription.class));
        eventLists.add(new EventList<Exam>(Exam.class));
    }

    boolean add(Object item) {
        for(EventList<?> list : eventLists) {
            if(list.tryToAdd(item)) {
                return true;
            }
        }
        return false;
    }
}

class EventList<T> {
    Class<T> type;
    List<T> list = new ArrayList<T>();

    EventList(Class<T> type) {
        this.type = type;
    }

    boolean tryToAdd(Object item) {
        if(type.isInstance(item)) {
            list.add(type.cast(item));
            return true;
        } else {
            return false;
        }
    }
}
class医疗{
列表>();
医学(){
添加(新的事件列表(Perscription.class));
添加(新的事件列表(Exam.class));
}
布尔添加(对象项){
对于(事件列表:事件列表){
如果(列表.尝试添加(项目)){
返回true;
}
}
返回false;
}
}
类事件列表{
班级类型;
列表=新的ArrayList();
事件列表(类类型){
this.type=type;
}
布尔值tryToAdd(对象项){
if(类型isInstance(项目)){
列表.添加(类型.铸件(项目));
返回true;
}否则{
返回false;
}
}
}

处方
MedicalEvent
的孩子吗?这与您的问题无关,但我认为使用MapYou似乎试图创建一个通用异构集合,我认为这在Java中是不可能的(特别是在没有任何关于类型安全的编译器警告的情况下).我想我会选择不同的清单。现在我想起来了,这就简单多了,泛型也一样。谢谢,这真的很有帮助。有关于泛型的Oracle Java教程主题:。除此之外,它还有专门的页面介绍您的问题:和
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();
void doSomethingWithEvents(List<? extends Event> events) {
}
class Medical {
    List<EventList<?>> eventLists = new ArrayList<EventList<?>>();

    Medical() {
        eventLists.add(new EventList<Perscription>(Perscription.class));
        eventLists.add(new EventList<Exam>(Exam.class));
    }

    boolean add(Object item) {
        for(EventList<?> list : eventLists) {
            if(list.tryToAdd(item)) {
                return true;
            }
        }
        return false;
    }
}

class EventList<T> {
    Class<T> type;
    List<T> list = new ArrayList<T>();

    EventList(Class<T> type) {
        this.type = type;
    }

    boolean tryToAdd(Object item) {
        if(type.isInstance(item)) {
            list.add(type.cast(item));
            return true;
        } else {
            return false;
        }
    }
}