Мне любопытно, как все это работает. У меня есть интерфейс, давайте назовем его A
. Когда я смотрю на A
, он имеет большинство необходимых мне методов, но не все, и у меня нет контроля над интерфейсом A
, поэтому я расширяю его интерфейсом B
, который реализует 1 или любое другое число методов, которые мне нужны поверх A
.
public interface B extends A {
String doSomethingFun(String blah);
}
A
имеет класс реализации с именем Client
. Через секунду я собираюсь создать свой собственный класс реализации B
с именем MyDefaultClient
.
Затем я создам конкретный класс, который реализует B
, например:
@Component
public class MyDefaultClient implements B {
private A myClient;
@Autowired
public MyDefaultClient(A myClient) {
this.myClient = myClient;
}
@Override
public String doSomethingFun(String filename) {
// custom business logic
}
@Override
public String serviceName() {
return myClient.serviceName();
}
@Override
public void close() {
myClient.close();
}
}
serviceName()
и close()
- это методы, которые A заставляет своих разработчиков реализовывать. Хотя есть и другие методы, которые имеют реализации по умолчанию, которые не заставляют меня их реализовывать, я полагаю, просто потому, что они имеют реализации по умолчанию.
На данный момент у меня есть конкретный класс, который я могу создать в других местах и вызовите все методы A
и B
. Но это только потому, что в интерфейсе есть реализации по умолчанию для этих методов, например, вот так?
default Blah someMethodInA(String thing) {
throw new UnsupportedOperationException();
}
Если я использую этот код и вызываю myDefaultClient.doSomethingFun("hello")
, я почти уверен, что сделаю то, что хочу это делать. Но что если я позвоню myDefaultClient.someMethodInA()
? Будет ли он вызывать реализованный метод в Client
, который является A
разработчиком? Или он упадет на пол и пожалуется на UnsupportedOperationException
? Если последнее, есть ли какой-нибудь способ, которым я могу структурировать это так, чтобы я мог вызывать все методы A
из реализации B
?