具有嵌套类泛型参数的 Java 覆盖方法



我正在尝试覆盖以下方法,但我无法弄清楚泛型机制:

public interface MyInterface<T extends MyGenericObject> {
    public void read(long id, Callback<T> callback);
    public void readAll(Callback<Collection<T>> callback);
}
public class SomeObject extends MyGenericObject {
    ...
}
public class MyClass implements MyInterface<SomeObject> {
    @Override
    public void read(long id, **????** callback) {
        ...
    }
    @Override
    public void readAll(**????** callback) {
        ...
    }
}

你能帮帮我吗?

编辑:我在MyClass和MyInterface之间有一个中间接口,通用的SomeObject没有一直传递,这是我的问题......

只需将每个T替换为传递给MyInterface<T>SomeObject即可。

// T has become SomeObject = put everywhere SomeObject instead of T
public class MyClass implements MyInterface<SomeObject> { 
    @Override
    public void read(long id, Callback<SomeObject> callback) {
        ...
    }
    @Override
    public void readAll(Callback<Collection<SomeObject>> callback) {
        ...
    }
}

编辑

您在评论中提到由于擦除问题,它无法编译(为什么在评论部分中解释了您收到此错误的原因(,但是您发布的代码无法做到这一点:

public interface MyInterface<T extends MyGenericObject> {
    void read(long id, Callback<T> callback);
    void readAll(Callback<Collection<T>> callback);
}
public interface Callback<T> {}
public class MyGenericObject {}
public class SomeObject extends MyGenericObject {}
public class MyClass implements MyInterface<SomeObject> {
    @Override public void read(long id, Callback<SomeObject> callback) {}
    @Override public void readAll(Callback<Collection<SomeObject>> callback) {}
}

此代码编译时没有任何错误:

import java.util.Collection;
interface Callback<T> {}
class MyGenericObject {}
interface MyInterface<T extends MyGenericObject> {
    public void read(long id, Callback<T> callback);
    public void readAll(Callback<Collection<T>> callback);
}
class SomeObject extends MyGenericObject { }
class MyClass implements MyInterface<SomeObject> {
    @Override
    public void read(long id, Callback<SomeObject> callback) {
    }
    @Override
    public void readAll(Callback<Collection<SomeObject>> callback) {
    }
}

如果你在MyClass中得到"read/readAll"与MyInterface中的read/readAll冲突;两种方法具有相同的擦除,但都不会覆盖另一种",那么您的代码与您指示的代码不同。

很确定你可以分别使用 Callback<SomeObject> callbackCallback<Collection<SomeObject>> callback

试试

public class MyClass<T extends  SomeObject> implements MyInterface<T> {

现在,您可以在方法实现中使用 T。您将在实例化 MyClass 时指定特定的类。

最新更新