[英]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類中,出現以下編譯錯誤:
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
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.