Java - ошибка «столкновение имен» и «конструктор не определен» при переопределении внутреннего класса, который наследует универсальный от внешнего класса - PullRequest
0 голосов
/ 29 мая 2018

Я недавно обновил версию eclipse и java в проекте, и произошли некоторые ошибки.Я попытался воспроизвести и обнаружил, что следующие настройки приводят к ошибкам в Eclipse Oxigen.3a (4.7.3a) с использованием Java 1.8, тогда как то же самое работает с eclipse 3.7.2 и Java 1.7

TestSomeObject.Java:

package a;
public class TestSomeObject
{
}

TestGeneric.java:

package a;
public class TestGeneric<T>
{
  T element;

  protected class InnerGeneric
  {
     T innerElement;

     public InnerGeneric() { }
  }
}

TestA.java:

package a;

public class TestA extends TestGeneric<TestSomeObject>
{
  public TestA(String a, String b) {}

  public InnerA someMethod(String some, InnerGeneric inner)
  {
     return new InnerA(some, inner);
  }

  protected class InnerA
  {
     public InnerA(String a, InnerGeneric b) {  }
  }
}

TestB.java

package a;
import a.TestA;

public class TestB extends TestA
{
  public TestB(String a, String b){
     super(a,b);
  }

  public InnerA someMethod(String some, InnerGeneric inner)
  {
     return new InnerB(some, inner);
  }

  protected class InnerB extends InnerA
  {
     public InnerB(String a, InnerGeneric b)
     {
        super(a, b);
     }
  }
}

ВКласс B, я получаю следующие ошибки компиляции:

  1. someMethod: Description Resource Path Location Type Name clash: The method someMethod(String, TestGeneric<TestSomeObject>.InnerGeneric) of type TestB has the same erasure as someMethod(String, TestGeneric<TestSomeObject>.InnerGeneric) of type TestA but does not override it TestB.java line 13 Java Problem
  2. при вызове super (a, b): Description Resource Path Location Type The constructor TestA.InnerA(String, TestGeneric<TestSomeObject>.InnerGeneric) is undefined TestB.java line 22 введите код здесь Java Problem

В версии Eclipse: 3.7.2 и Java 1.7 это работает.

Почему это так?Что я могу сделать, чтобы устранить ошибки?

1 Ответ

0 голосов
/ 29 мая 2018

Ответ заключается в том, чтобы точнее определить класс InnerGeneric в сигнатуре метода:

TestB.java:

package a;

public class TestB extends TestA
{
  public TestB(String a, String b){
     super(a,b);
  }

  public InnerA someMethod(String some, TestGeneric<TestSomeObject>.InnerGeneric inner)
  {
     return new InnerB(some, inner);
  }

  protected class InnerB extends InnerA
  {
     public InnerB(String a, TestGeneric<TestSomeObject>.InnerGeneric b)
     {
        super(a, b);
     }
  }
}
...