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

时间:2012-01-03 22:22:12

标签: java grails groovy

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

然而推杆:

public abstract String toString();

导致编译错误:

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

我相信这可能是因为groovy已经定义了toString。

由于

5 个答案:

答案 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");
      }
    });


  }