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