BasePage.java
public class BasePage {
//do stuff
}
Center.java
public class Center {
public BasePage click(){
click(button);
return new BasePage(this);
}
// do other stuff
}
public class Helper {
protected Center center;
// do stuff
}
Page.java
public class Page extends BasePage {
//do stuff
}
TestClass.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();
}
答案 0 :(得分:3)
举个例子:
Subclass inherits from Superclass
Subclass sub;
sub = new Superclass(); // is not valid
Superclass super = new Subclass(); // is valid
// basic laws of polymorphism
理解它的最简单方法是,容器应该大于它所存储的对象类型。在这种情况下,Superclass比Subclass大,这就是第二个语句正确的原因。
如果您需要以任何方式使用第一个语句,请尝试强制转换。
sub = (Subclass)(new Superclass()); // is valid
答案 1 :(得分:2)
page = center.click();
您的page
是baseclass Page
的引用,而您的方法center.click()
会返回超类BasePage
类型的对象。
您不能将超类对象分配给子类引用。
您需要明确指定BasePage
到Page
: -
page = (Page)center.click();
但这也可能无效,因为,您将从您的方法返回new BasePage(this)
,该方法不是Page
的实例。
您需要返回Page
类型的对象,而不是: - new Page(this)
,您可以将其转换为分配给页面引用。
此外,您正在class
内直接执行此任务,这是不正确的。您需要有一个方法,或者您只需要在声明时初始化它。
Page page = (Page)center.click();
答案 2 :(得分:1)
两个问题。首先,page = center.click();
似乎不在方法内。 (如果它实际上不在您的代码中,请先修复它。)
然后,分配仍然无效,因为BasePage
返回的center.click()
可能不是Page
的实例。 (事实上,事实并非如此。)
对Center
和TestClass
的代码进行以下替换:
BasePage
=>Object
Page
=>String
然后应该清楚为什么会出现问题。
答案 3 :(得分:1)
那是因为你不能将超类对象分配给子类对象。假设您的代码是正确的,在Center.click()
方法上,您将返回一个新的BasePage
对象。 Page
是BasePage
的子类,该分配无效。
您必须返回Page
或Page
的子类,然后将其输入Page
。