Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8301668

JShell should mention overriding & hierarchy errors in overwritten classes

XMLWordPrintable

    • generic
    • generic

      A DESCRIPTION OF THE PROBLEM :
      As mentioned in JShell User's Guide (https://docs.oracle.com/en/java/javase/19/jshell/snippets.html), JShell will display an error message while attempting to use malformed overwritten variables, methods and classes. For example:
      $ jshell
      | Welcome to JShell -- Version 19.0.1
      | For an introduction type: /help intro

      jshell> int foo = 42;
      foo ==> 42

      jshell> int getFoo() { return foo;}
      | created method getFoo()

      jshell> double foo = 42.0
      foo ==> 42.0

      jshell> getFoo()
      | attempted to call method getFoo() which cannot be invoked until this error is corrected:
      | incompatible types: possible lossy conversion from double to int
      | int getFoo() { return foo;}
      | ^-^

      However, errors about overriding and hierarchy are not displayed by default, but instead display a "cannot find symbol" error. These include:
      a) A method is overridden by a method with incompatible return type
      b) Interfaces appear in `extends` clause
      c) A class appears in `implements` clause
      d) A subclass of an abstract class does not override abstract methods
      e) @Override is annotated on a method that does not override


      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Run jshell without any options, and input code shown in "Source Code" section.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      For example, for the last line in case a, it should display a message like:
      | attempted to reference class Bar which cannot be referenced until this error is corrected:
      | method() in Bar cannot override method() in Foo
      | return type void is not compatible with int
      | void method() {}
      | ^--------------^
      ACTUAL -
      For the last line in all cases, it displays:
      | Error:
      | cannot find symbol
      | symbol: class Bar
      | new Bar()
      | ^-^

      ---------- BEGIN SOURCE ----------
      // Case a:
      class Foo {
          void method() {}
      }
      class Bar extends Foo {
          void method() {}
      }
      class Foo {
          int method() { return 0; }
      }
      new Bar() // This line should display "cannot be referenced until this error is corrected" message

      // Case b:
      class Foo {}
      class Bar extends Foo {}
      interface Foo {}
      new Bar() // This line should display "cannot be referenced until this error is corrected" message

      // Case c:
      interface Foo {}
      class Bar implements Foo {}
      class Foo {}
      new Bar() // This line should display "cannot be referenced until this error is corrected" message

      // Case d:
      class Foo {
          void method() {}
      }
      class Bar extends Foo {}
      abstract class Foo {
          abstract void method();
      }
      new Bar() // This line should display "cannot be referenced until this error is corrected" message

      // Case e:
      class Foo {
          void method() {}
      }
      class Bar extends Foo {
          @Override void method() {}
      }
      class Foo {}
      new Bar() // This line should display "cannot be referenced until this error is corrected" message
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Add -v option (it displays the error message only when you make subclasses malformed)

      FREQUENCY : always


        1. CaseE.java
          0.2 kB
        2. CaseD.java
          0.2 kB
        3. CaseC.java
          0.2 kB
        4. CaseB.java
          0.2 kB
        5. CaseA.java
          0.2 kB

            Unassigned Unassigned
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: