我有一个抽象的父类,我希望强制所有子类来实现toString()方法。
然而推杆:
public abstract String toString();
导致编译错误:
Repetitive method name/signature for method 'java.lang.String toString()' in class ...
我相信这可能是因为groovy已经定义了toString。
由于
答案 0 :(得分:16)
这对我有用。这是新的还是别人错过了?
public abstract class Filterable
{
@Override
public abstract String toString();
}
public class ABC extends Filterable
{
// Won't compile without toString();
}
答案 1 :(得分:11)
toString()
是java.lang.Object
类的一部分,它已经有了默认实现。所以你基本上不能强迫子类实现它。如果你想强迫这种行为(不确定原因)那么你可以做类似下面的事情
public class abstract SuperClass {
public abstract String myToString();
public String toString() {
return myToString();
}
}
答案 2 :(得分:7)
简短回答:不可能。 答案很长:您可以通过执行以下操作来尝试解决此问题,在父类中实现:
public final String toString() {
getString();
}
public abstract String getString();
这会导致子类需要实现" getString()"方法。但是,如果子类实现了" getString()"那么子(孙)类的子节点不能保证被强制实现该方法。方法。例如:
A is the parent class, with the getString() method.
B extends A, and implements the getString() method.
C extends B, doesn't have to implement the getString() method.
希望有所帮助:)
答案 3 :(得分:0)
你不能强制它们覆盖toString(),但你可以在抽象的父类中使用toString()调用另一个抽象方法youGottaOverideToString(),这些子类必须实现。
答案 4 :(得分:0)
您可以编写一个单元测试,它将找到扩展抽象类的所有类,并验证它们是否声明了toString()。要扫描,您可以使用Reflections库:
@Test
public void validateToString() {
final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder()
.setUrls(ClasspathHelper.forPackage("my.base.package"))
.filterInputsBy(new FilterBuilder()
.include(".*Dto.*") // optionally filter only some particular classes
.exclude(".*Test.*")) // exclude classes from tests which will be scanned as well
.setScanners(new SubTypesScanner(false)));
final Set<Class<?>> allDtoClasses = dtoClassesReflections.getSubTypesOf(YourAbstractClass.class); // you set your class here (!!). You can set Object.class to get all classes
allDtoClasses.forEach(dtoClass -> {
logger.info("toString() tester testing: " + dtoClass);
try {
dtoClass.getDeclaredMethod("toString");
} catch (NoSuchMethodException e) {
fail(dtoClass + " does not override toString() method");
}
});
}