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

时间:2017-06-09 13:28:19

标签: java generics nested-generics

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

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

4 个答案:

答案 0 :(得分:2)

只需将T替换为传递给SomeObject的{​​{1}}即可。

MyInterface<T>

修改

您在评论中提到它由于擦除问题而无法编译(为什么您会在评论部分中解释此错误),但是对于您发布的代码,这是不可能的:

// 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) {
        ...
    }
}

答案 1 :(得分:2)

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

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有关;两种方法都有相同的擦除,但都没有覆盖另一种方法“,那么你的代码与你指示的不同。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

尝试

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

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