【问题标题】:How to create constructor for generic class (and its subclass) in java如何在java中为泛型类(及其子类)创建构造函数
【发布时间】:2020-05-13 17:27:43
【问题描述】:

我有两个类,一个是泛型​​类,另一个是泛型​​的子类。我不确定如何为每个类创建构造函数。下面是代码示例:

public class A<T> {
    protected T personInfo;
    protected int age;
    protected String firstName;
    protected String lastName;
    protected int id;
    protected Long port;
    protected String ipAddress;

    public A(T personInfo, int age, String firstName, String lastName, int id, Long port, String 
        ipAddress) {
        this.personInfo = personInfo;
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
        this.id = id;
        this.port = port;
        this.ipAddress = ipAddress;
    }
}

public class B extends A<maleInfo> {
    protected maleInfo personInfo; //not sure if this is necessary

    public B(//do I need this?)
    ...
}

基本上,所有变量都被 B 使用,B 使用maleInfo 作为泛型 T。如果我在泛型类中创建构造函数,intelliJ 会说 B 类中的“personInfo”可能未初始化。实现这一目标的正确方法是什么?

另外,如果我在基类中为 personInfo(通用)创建 getter/setter,子类是否还需要为其创建 getter/setter?

【问题讨论】:

    标签: java generics constructor


    【解决方案1】:

    您不需要该属性,但您需要子类中的构造函数。

    属性是继承的(尽管在 99% 的情况下,我认为受保护的成员是一种代码味道),而构造函数在 Java 中从不继承。

    您的子类应如下所示:

    public class B extends A<maleInfo> {
    
      public B(maleInfo personInfo, int age, String firstName, String lastName, int id, Long port, String ipAddress) {
        super(...)
      }
    
    }
    

    您的代码还有一些问题:

    Java 中的类应始终以大写字母开头,即 MaleInfo 而不是 maleInfo

    然后作为最佳实践:类应该始终是抽象的或最终的。我不知道你的具体用例,但我会考虑制作 A 抽象(带有 protected 构造函数)和 B final。

    最后:对您的成员进行操作的代码应尽可能靠近您的成员所在的位置。所以我怀疑,你想要私有成员而不是 A 中的受保护成员和受保护方法,它们对这些成员进行操作并且也可以从 B 调用

    【讨论】:

    • 基类需要构造函数吗?如果是这样,我应该如何为子类编写构造函数?我猜除了“T personInfo”之外的一切都是“maleInfo personInfo”?
    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多