Подтвердить что ты не робот

Унаследованный метод Object.clone() не может скрыть публичный абстрактный метод

Итак, у меня есть этот бит безумного, сумасшедшего кода, который заставляет компилятор плюнуть мне в лицо на несколько часов следующую ошибку:

The inherited method Object.clone() cannot hide the public abstract method in IOrderable<T>

Ключи преступника следующие (ошибка появляется прямо в 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);
}

Да, они кажутся случайными. Они существуют только для проверки некоторых странных вещей в проекте компилятора /java _byte_code_instrumentation, который я делаю. Как я могу выполнять эту работу, сохраняя логическую целостность?

Спасибо

4b9b3361

Ответ 1

Я столкнулся с одной и той же ошибкой компиляции, и, насколько я могу судить, это крайний случай в спецификации для типов пересечений (многосвязные общие типы), и нет решения.

Небольшой тестовый пример:

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

У вас не может быть типа пересечения, содержащего любые интерфейсы, содержащие какой-либо метод, чья подпись соответствует непубличному методу базового класса (в данном случае - неявно Object). Однако это не относится к объекту или клону:

public abstract class Base {
    protected abstract void m();
}

public interface Interface {
    public void m();
}

public class Class<T extends Base & Interface> {} // not ok

Здесь соответствующая ошибка Oracle, отмеченная как "Не дефект".

Вот соответствующая ошибка Eclipse, где компилятор был изменен, чтобы создать ту же ошибку, что и javac. Это, по-видимому, было изменением для Indigo 3.7, что объясняет, почему некоторые люди могли воспроизвести, а другие не могли.

Ответ 2

Я думаю, этот учебник объясняет проблему, и вы должны иметь возможность понять решение. Проблема заключается в том, что параметр типа имеет несколько границ.

Ниже приведен код ошибки.

interface Xpto
{
}

interface Xable < T >
{
    T clone ( ) ;
}

class MyStuff < S extends Xpto & Xable < S > >
{
}

Однако приведенный ниже код в основном тот же, но без ошибки компилятора.

interface Xpto
{
}

interface Xable < T > extends Xpto
{
    T clone ( ) ;
}

class MyStuff < S extends Xable < S > >
{
}

Ответ 3

Я решаю эту проблему, реализуя клон как общедоступный

Ответ 4

У меня тоже есть эта ошибка, но я думаю, что я пришел к ней по-другому.

следующий код работает нормально: (он вложен в другой класс, поэтому для интерфейса не требуется публичных методов).

interface A{}
class B{
    class C extends B implements A{ }
}

проблема возникает, когда вы добавляете непубличный метод в интерфейс A и реализуете его непублично в классе B.

interface A{
    void doeet();

}

class B{
    void doeet(){};
    class C extends B implements A{
    }
}

Глядя на ваш код, он кажется похожим на то, что некоторые из методов в интерфейсах не были объявлены публичными.