Java泛型-如何访问子类参数

Java泛型-如何访问子类参数,java,Java,我的示例代码结构如下所示。有一个父类建筑和一个子类房屋 建筑物 房子 我想写一个泛型方法,这样我也可以访问子类方法。 像这样的 public <T> void construct(T a){ System.out.println(a.getHouseNumber()); } 请帮助。泛型与此问题无关。Java为您提供了运行时多态性功能,但您不能使用父引用调用子对象的特定方法 考虑以下情况: Building b = new House(); //Fine b.getHou

我的示例代码结构如下所示。有一个父类建筑和一个子类房屋

建筑物

房子

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

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

请帮助。

泛型与此问题无关。Java为您提供了运行时多态性功能,但您不能使用父引用调用子对象的特定方法

考虑以下情况:

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

事实上,您的示例没有显示泛型的需要。您可以使用:

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

你不能,也不应该那样做。让父类知道子类自己的具体方法是个坏主意

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

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

请注意,父类不必是抽象的,只要您的设计没有问题

我同意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();
    }
}

我强烈建议不要那样做。这是一个糟糕的设计,今后会产生更多的问题。一个相对较好的替代方法是在父类中定义一个抽象方法,并在子类中重写它。您想在哪里编写该静态方法?为什么不将T改为House,现在没有理由使用泛型。getHouseNumber是House类的方法吗?也许通过使用Lombock@slartidan:是的,它是House子类的一部分。
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());
    }
}
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();
    }
}