Частные методы были предоставлены как функция для интерфейсов Java, чтобы помочь писать методы по умолчанию в интерфейсах без повторного использования кода. Они не предназначены для использования при наследовании реализации.
Если вы хотите наследовать и использовать реализованные методы, например, те, которые вы пытались здесь:
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
вы хотите либо реализовать метод в суперклассе и расширить этот класс, либо реализовать метод как метод по умолчанию в интерфейсе. Использование суперкласса было бы более обычным способом сделать это.
Используя предоставленный вами код, вы можете сделать что-то вроде этого:
class Printer {
protected void print(String listTitle, List<E> listToPrint) {
StringBuilder string = new StringBuilder();
string.append(listTitle);
for (E request : listToPrint) {
string.append("\n").append(request);
}
}
затем расширить этот класс:
public class FundingRequests extends Printer implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
}
хотя это ограничит ваш класс только расширением этого класса. Лучшим вариантом было бы реализовать этот метод как открытый статический метод в классе, а затем использовать его следующим образом:
class Printer {
public static void print(String listTitle, List<E> listToPrint) {
StringBuilder string = new StringBuilder();
string.append(listTitle);
for (E request : listToPrint) {
string.append("\n").append(request);
}
}
}
затем используйте метод:
public class FundingRequests implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
Printer.print("",new ArrayList<>(requests));
}
}
или, если вы действительно хотите сойти с ума, вы можете осуществить это с помощью абстрактного класса:
abstract class RequestData<E> {
abstract void add(E newRequest);
abstract List<E> getRequests();
abstract List<E> getFulfilledRequests();
abstract List<E> getUnfulfilledRequests();
abstract void printRequests();
abstract void printFulfilledRequests();
abstract void printUnfulfilledRequests();
protected void print(String listTitle, List<E> listToPrint) {
StringBuilder string = new StringBuilder();
string.append(listTitle);
for (E request : listToPrint) {
string.append("\n").append(request);
}
System.out.println(string);
}
}
затем расширить этот класс:
public class FundingRequests extends RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
// implement the abstract methods
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
}