dev*_*ium 13 java compiler-construction generics
所以,我有一些狂野的,疯狂的代码,这使得编译器在我的脸上吐了几个小时以下错误:
The inherited method Object.clone() cannot hide the public abstract method in IOrderable<T>
Run Code Online (Sandbox Code Playgroud)
罪魁祸首类如下(错误出现在通用的T中):
public class MyInterval<T extends Xpto & Successorable<T>> implements Cloneable {
public MyInterval<T> clone(){
MyInterval<T> it = null;
try {
it = (MyInterval<T>) super.clone();
it.max = it.max.clone();
it.min = (T) it.min.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return it;
}
}
public interface Xpto {}
public interface Successorable<Y> extends IOrderable<Y> {
Y suc();
}
interface IOrderable<J> extends Rankable<J>, Cloneable {
boolean greaterEq(J e);
J clone();
}
public interface Rankable<P> {
int rank(P e);
}
Run Code Online (Sandbox Code Playgroud)
是的,他们似乎有点随意.它们仅用于在我正在进行的编译器/ java_byte_code_instrumentation类项目中测试一些奇怪的东西.如何在保持逻辑完整的同时完成这项工作?
谢谢
我遇到了相同的编译错误,据我所知,这是交集类型(多重绑定泛型类型)规范中的边缘情况,并且没有可能的解决方案.
一个小测试用例:
public interface InterfaceA {
public Object clone();
}
public interface InterfaceB {}
public class ClassA<T extends InterfaceA> {} // ok
public class ClassB<T extends InterfaceA & InterfaceB> {} //not ok
Run Code Online (Sandbox Code Playgroud)
您不能拥有包含任何接口的交集类型,该接口包含其签名与基类上的非公共方法匹配的任何方法(在本例中为隐式Object).这不是特定于Object或clone,但是:
public abstract class Base {
protected abstract void m();
}
public interface Interface {
public void m();
}
public class Class<T extends Base & Interface> {} // not ok
Run Code Online (Sandbox Code Playgroud)
这是相关的Oracle错误,标记为"非缺陷".
这是相关的Eclipse错误,其中修改了编译器以产生与javac匹配的相同错误.这似乎是Indigo 3.7的一个变化,这解释了为什么有些人可以复制而其他人无法复制.
归档时间: |
|
查看次数: |
6374 次 |
最近记录: |