Java 使用嵌套 类 泛型参数覆盖方法

Java override method with nested classes generic parameters

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

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 没有一路传递,这是我的问题...

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

只需将每个 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) {
    }
}

如果您得到 "read/readAll in MyClass clashes with read/readAll in MyInterface; both methods have same erasure, yet neither overrides the other",那么您的代码与您指定的不同。

尝试

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

现在您可以在方法实现中使用 T。您将在实例化 MyClass 时指定具体的 class。