Java - 'Name clash' 和 'constructor undefined' 覆盖从外部 class 继承泛型的内部 class 时出错
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);
}
}
}
在class测试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
- 调用 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 和 Java1.7 中,这有效。
这是为什么?我该怎么做才能清除错误?
答案是,更精确地定义方法签名中的 InnerGeneric class:
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);
}
}
}
最近在项目中升级了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);
}
}
}
在class测试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
- 调用 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 和 Java1.7 中,这有效。
这是为什么?我该怎么做才能清除错误?
答案是,更精确地定义方法签名中的 InnerGeneric class:
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);
}
}
}