3

BasePage.java

public class BasePage {
  //do stuff
}

中心.java

public class Center {
    public BasePage click(){
        click(button);
        return new BasePage(this);
    }

    // do other stuff
}

public class Helper {
    protected Center center;

        // do stuff
}

页面.java

public class Page extends BasePage {
   //do stuff
}

测试类.java

public class TestClass extends Helper {
    private Page page;

    // I can use "center.click()" because TestClass extends from Helper, 
    // and "center" is a protected variable in Helper
    // "center.click()" returns type 'BasePage'
    // 'page' is a type 'Page' which extends 'BasePage'
    // So why can't I put the result of "center.click()" into 'page' ?
    page = center.click();

}
4

4 回答 4

3

举个例子:

Subclass inherits from Superclass

Subclass sub;

sub = new Superclass(); // is not valid

Superclass super = new Subclass(); // is valid
// basic laws of polymorphism

理解它的最简单方法是,容器应该比它所存储的对象类型大。在这种情况下,超类大于子类,这就是为什么第二个陈述是正确的。

如果您需要以任何方式使用第一条语句,请尝试强制转换。

sub = (Subclass)(new Superclass()); // is valid
于 2012-10-17T15:49:25.077 回答
2
page = center.click();

page是一个引用,baseclass Page而你的方法center.click()返回一个 super class 类型的对象BasePage

您不能将超类对象分配给子类引用。

您将需要明确地类型转换您BasePagePage: -

page = (Page)center.click();

但这也可能不起作用,因为您正在new BasePage(this)从您的方法返回,该方法不是Page.

您需要返回一个类型的对象,Page例如: - new Page(this),您可以对其进行类型转换以分配给 Page 引用..

此外,您正在直接在内部执行此分配,class这是不正确的。要么你需要一个方法,要么你只需要在声明时初始化它..

Page page = (Page)center.click();
于 2012-10-17T15:47:55.917 回答
1

两个问题。首先,page = center.click();好像里面没有一个方法。(如果它实际上不在您的代码中,请先修复它。)

然后,分配仍然不起作用,因为返回的BasePage可能center.click()不是Page. (事实上​​,并非如此。)

对您的代码进行以下替换CenterTestClass

BasePage=> Object
Page=>String

然后应该清楚为什么会出现问题。

于 2012-10-17T15:47:15.903 回答
1

那是因为您不能将超类对象分配给子类对象。假设您的代码是正确的,在您的Center.click()方法上,您将返回一个新BasePage对象。Page是的子类,BasePage并且该分配无法工作。

您将必须返回一个类,该类是 的一个Page或子类,Page然后将其类型转换为Page.

于 2012-10-17T15:47:34.893 回答