По определению апкастинг
переменная класса Parent ссылается на объект класса Child
Другими словами, если class A
является родителем, то class B extends A
это ребенок.Upcasting будет:
B b = new B();
A a = b; // upcasting
Но отношения между RemoteWebDriver и WebDriver не являются родителями / потомками:
RemoteWebDriver implements WebDriver
Следовательно, здесь нет никакого upcast.И вопрос в другом:
почему бы нам не объявить конкретный тип RemoteWebDriver вместо WebDriver при создании объекта любого драйвера браузера
причины те же, что и при ответе на более общий вопрос: Почему предпочтителен интерфейс для класса Java? .И действительно: если бы разработчики Selenium удалили / устарели RemoteWebDriver
, вы бы хотели изменить свои тесты?
Кстати: вот случай фактического обновления до RemoteWebDriver:
ChromeDriver driver = new ChromeDriver(); // ChromeDriver extends RemoteWebDriver
RemoteWebDriver remoteDriver = driver;
Также верно следующее, хотя трудно найти причину, по которой вы хотите это сделать:
WebDriver driver = new ChromeDriver();
RemoteWebDriver remoteDriver = (RemoteWebDriver) driver;
Один из случаев использования, который я видел, это когда люди хотят использовать какой-то другой интерфейс, реализованныйRemoteWebDriver (т.е. не WebDriver
, а, скажем, TakesScreenshot
).Но тогда лучше привести к этому интерфейсу напрямую:
WebDriver driver = new ChromeDriver();
TakesScreenshot ts = (TakesScreenshot) driver;
ts.getScreenshotAs(...);