Java Generics - 如何访问子类参数

时间:2018-06-01 14:22:43

标签: java

我的示例代码结构是这样的。有一个父类Building和一个子类House。

层楼高

public class Building {
    private String name;
    private int noOfHouses; 
}

内部

public class House extends Building {
    private String houseNumber;
}

我想编写一个泛型方法,以便我也可以访问子类方法。 像这样的东西。

public <T> void construct(T a){
    System.out.println(a.getHouseNumber());
}

请帮忙。

4 个答案:

答案 0 :(得分:1)

事实上,您的示例并未显示泛型的必要性。您可以使用:

public static void construct(House a){
    System.out.println(a.getHouseNumber());
}

同样的事情,使用泛型不必要地复杂也可以正常工作:

public static <T extends House> void construct(T a){
    System.out.println(a.getHouseNumber());
}

答案 1 :(得分:0)

泛型与此问题无关。 Java为您提供RunTimePolymorphism的功能,但您无法使用父引用调用子级的特定方法。

考虑以下情况:

Building b = new House();  //Fine
b.getHouseNumber() // Compiler will  be happy only if getHouseNumber is in Building.

答案 2 :(得分:0)

你不能,也不应该这样做。让父类了解子类的具体方法是个坏主意。

如果此方法位于House,或者任何其他不使父/子关系复杂化的类,则可以使用有界参数:

public static <T extends House> void construct(T a){
    System.out.println(a.getHouseNumber());
}

如果父项是抽象的,可以做同样的事情,如上所述:

public abstract class Building {

    private String name;

    private int noOfHouses; 

    public abstract String getHouseNumber();

    public static <T extends Building> void construct(T a){
        System.out.println(a.getHouseNumber());
    }
}

请注意,父级不必是抽象的,只要它与您的设计一致

即可

答案 3 :(得分:0)

我同意Ernest Kiwele,但是如果你想访问一个属于子类的方法,你可以覆盖每个子类中的方法

abstract class Building{
    private String name;
    private int noOfHouses;

    public abstract String getHouseNumber();

    public void construct(){
        System.out.println( getHouseNumber() );
    }
}

public class House extends Building{

    private String houseNumber = "houseNumber";

    public String getHouseNumber(){
       return this.houseNumber;
    }

    public static void main(String[] args){
      House h = new House();
      h.construct();
    }
}