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> callback
和 Callback<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。
我正在尝试覆盖以下方法,但我无法弄清楚泛型机制:
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> callback
和 Callback<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。