【问题标题】:Is it possible to extend a parametrized class to another parametrized class with one parameter inheriting from the first one?是否可以将参数化类扩展到另一个参数化类,其中一个参数继承自第一个参数?
【发布时间】:2021-09-09 16:09:45
【问题描述】:

我对 Java 还很陌生,所以我不知道这是否是一种不好的做法,甚至可能,但让我们开始吧。

我正在尝试了解地图中继承的工作原理。假设我有这三个类:

public abstract class Person{
    private String ssNumber;
    public void genericPersonMethod(){/*do thing*/}
}

public class Patient extends Person{
    private String patientID;
    public void specificPatientMethod(){/*do thing*/}
}

public class Medic extends Person{
    private String medicID;
    public void specificMedicMethod(){/*do thing*/}
}

}

然后我尝试为每个扩展类构建某种粗略的数据库。我试过这样做:

public abstract class PersonDB extends HashMap<String, Person>{
    private RandomObject personDBGenericProperty;
    public void genericThingToDoWithAPersonDB(){}
}

public class PatientDB extends PersonDB{
    private RandomObject patientDBSpecificProperty;
    public void specificThingToDoWithaPatientDB(){}
}

但后来我发现它不起作用,它不能有效地将PersonDB 扩展到另一个类。如果我只做一些PatientDB extends PersonDBMedicDB extends PersonDB,问题是我理论上可以同时插入Patients 和Medics,而且我无法访问任何一个类的特定方法,因为它们都被认为是@ 987654330@s。执行PatientList&lt;String, Patient&gt; extends PersonDB 更糟糕,因为它随后接受任何Object。老实说,我不知道下一步该做什么。

此外,即使出于某种原因这最终成为不好的做法(在这种情况下,我愿意学习任何可用的解决方法),我仍然想知道是否有办法以这种特定方式做到这一点,只是出于好奇。

【问题讨论】:

  • 我试图了解这里的结构。当您说可以同时插入PatientMedic 时,是通过PersonList 类中的方法吗?此外,在读取此数据时,您可以根据您使用的是PatientList 还是MedicList,将Person 类型转换为所需的子类。现在这里有一个有趣的地方是MedicList 如何知道它是否收到了来自PersonListMedicPatient。这可以通过在 Person 类中提供一个鉴别器来将一个人标记为医生或患者来处理。让我知道您对此的看法!
  • 当我说我可以同时插入 PatientMedic 这是因为 PatientListMedicList 根本不区分,因为它们都继承自 PersonList 类,它又从&lt;String, Person&gt; 映射延伸。由于两者都是Persons,我想它们都适合列表。我没有考虑选角,因为我知道这不太理想,所以如果可能的话,我想避免它,并有很强的歧视性。关于最后一点,我真的不知道如何做到这一点。
  • 感谢您的解释。我可以问一下为什么你认为铸造不太理想。无论如何,如果您想要更强烈的区分,您需要在PatientMedic 实例之间保持某种分离。一种方法是使用我提到的鉴别器方法。简单地说,你在你的 Person 类中添加一个字段,告诉你一个人是 Medic 还是 Patient。现在在您的 PatientList 实现中,即使您从一个公共列表中获取 Persons,您也可以过滤掉非患者以确保您的 PatientList 仅返回 Patients
  • OT:调用 (Hash)Map (Person|Patient)List 具有误导性,因为它们是 Java 中两个不同的知名容器。我会简单地称它为PersonsPatients
  • 好电话,他们得到了这个名字,因为它们最初是列表,然后我改变了类型;我马上修改。

标签: java generics inheritance hashmap


【解决方案1】:

最好的方法可能是参数化地图中的人物类别:

public abstract class PersonDB<P extends Person> extends HashMap<String, P> {
    private RandomObject personDBGenericProperty;
    public void genericThingToDoWithAPersonDB(){}
}

public class PatientDB extends PersonDB<Patient> {
    private RandomObject patientDBSpecificProperty;
    public void specificThingToDoWithAPatientDB(){}
}

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2013-07-18
    • 2019-08-31
    • 1970-01-01
    • 2020-08-11
    • 2021-10-28
    • 2011-01-04
    • 2018-04-03
    • 2021-12-24
    相关资源
    最近更新 更多