在子类中强制执行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"); } }); }