在子类中强制执行toString()实现

我有一个抽象的父类,我希望它强制所有子类实现toString()方法。

但是放:

public abstract String toString(); 

导致编译错误:

 Repetitive method name/signature for method 'java.lang.String toString()' in class ... 

我相信这可能是由已经定义了toString的groovy引起的。

谢谢

toString()java.lang.Object类的一部分,它已经有一个默认的实现。 所以你基本上不能强迫子类实现它。 如果你想强迫这种行为(不确定为什么)那么你可以做类似下面的事情

 public class abstract SuperClass { public abstract String myToString(); public String toString() { //print super class fileds //enable subclass to do the printing myToString(); } } 

这对我有用。 这是新的还是别人错过了?

 public abstract class Filterable { @Override public abstract String toString(); } public class ABC extends Filterable { // Won't compile without toString(); } 

简答:不可能。 答案很长:您可以通过执行以下操作来尝试解决此问题,在父类中实现:

 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. 

希望有所帮助:)

你不能强制它们覆盖toString(),但你可以在抽象的父类中使用toString()调用另一个抽象方法youGottaOverideToString(),这些子类必须实现。

您可以编写一个unit testing,它将找到扩展抽象类的所有类,并validation它们是否声明了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> 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"); } }); }