簡體   English   中英

Java-覆蓋從外部類繼承泛型的內部類時,出現“名稱沖突”和“未定義構造函數”錯誤

[英]Java - 'Name clash' and 'constructor undefined' error when overriding inner class that inherits a generic from the outer class

我最近在項目中升級了eclipse和java版本,並且發生了一些錯誤。 我嘗試重現,發現以下設置導致使用Java 1.8的Eclipse Oxigen.3a(4.7.3a)中的錯誤,而對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中,此方法有效。

這是為什么? 如何清除錯誤?

答案是,要在方法簽名中更精確地定義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);
     }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM