使用在接口中实现的私有方法时遇到麻烦。
我在print(string, list)
界面中私下实现了一个RequestData
方法,以隐藏实现,因为我不想被该类的其他打印方法调用,但是我将其包含在接口,因为每个实现类都将是相同的。
问题是,当我尝试使用实现print
接口的FundingRequests
中的RequestData
方法时,它显示错误-print
方法的访问RequestData
接口是私有的,因此找不到。
好吧...如果无法从实现类中访问接口的私有方法,应该如何使用呢?
这是一个错误,还是我误解了接口?
接口:
package com.landbay.datamodel.data;
import java.util.List;
public interface RequestData<E> {
void add(E newRequest);
List<E> getRequests();
List<E> getFulfilledRequests();
List<E> getUnfulfilledRequests();
void printRequests();
void printFulfilledRequests();
void printUnfulfilledRequests();
private 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 implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
}
答案 0 :(得分:4)
作为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));
}
}
答案 1 :(得分:0)
您可以简单地完全退出该print()
方法,或使其成为嵌套的静态类。
public interface RequestData<E> {
void add(E newRequest);
List<E> getRequests();
List<E> getFulfilledRequests();
List<E> getUnfulfilledRequests();
void printRequests();
void printFulfilledRequests();
void printUnfulfilledRequests();
public static final class Printer {
protected static <E> 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 implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
Printer.print("",new ArrayList<>(requests));
}
}
这允许您将print()
保持在protected
的可访问性,但是它将公开Printer
嵌套的静态类,从public
的角度来看,它没有任何作用。如果可以使用方法public
,可以简单地将该方法定义为public static
(即实用程序)方法。
答案 2 :(得分:-2)
您应该使用受保护的修饰符。私有方法只能从同一类访问,而不能由子类访问。