Java 泛型:覆盖参数化 return 类型不同的方法
Java Generics: override method that differs in parameterized return type
我来自 .Net,我对 Java 开发还很陌生,所以这可能是个奇怪的问题:
我有一个 class 层次结构,例如:
Superclass implements GenericInterface<Superclass>
^
|
Subclass
其中 GenericInterface
非常简单:
public interface GenericInterface<T> {
OtherGenericInterface<T> getOther();
}
和OtherGenericInterface
最后使用类型参数:
public interface OtherGenericInterface<T> {
List<Object> processType(T left, T right);
}
现在,当我尝试在 Superclass
中实现接口时,我只是 return 一个匿名类型:
public class Superclass implements GenericInterface<Superclass> {
@Override
public OtherGenericInterface<Superclass> getOther() {
return new OtherGenericInterface<Superclass>() {
@Override
public List<Object> processType(T left, T right) {
...
}
};
}
}
到目前为止一切正常,但现在我尝试覆盖 Subclass
:
中的方法
public class Subclass extends Superclass (implements GenericInterface<Subclass>) {
@Override
public OtherGenericInterface<Subclass> getOther() {
...
}
}
并且在那里,我无法使用更具体的 return 类型覆盖该方法。即使我重新实现接口并将 Superclass 中的方法声明为 final 也是不可能的。
所以我的问题是:为什么 OtherInterface<MoreSpecificType>
不是更具体的,或者至少是相同的类型(由于类型擦除),因为这将是重写方法的要求吗?
这表明了对 Java 泛型的一个常见误解 - 认为 class 的匹配也将匹配子 classes(如参数类型)。事实并非如此。 Java 泛型旨在确保类型 完全匹配 。如果你想要灵活的空间,你必须指定和定义你想要的房间和多少。
这是一个允许您通过将签名准确指定为 <T extends Superclass>
来执行您想要的操作的版本。这可能不是您要找的东西,但我希望它能为您指明正确的方向。
public interface OtherGenericInterface<T> {
List<Object> processType(T left, T right);
}
public interface GenericInterface<T> {
OtherGenericInterface<T> getOther();
}
public class Superclass<T extends Superclass> implements GenericInterface<T> {
@Override
public OtherGenericInterface<T> getOther() {
return new OtherGenericInterface<T>() {
@Override
public List<Object> processType(Superclass left, Superclass right) {
return null;
}
};
}
}
public class Subclass extends Superclass {
@Override
public OtherGenericInterface<Subclass> getOther() {
return null;
}
}
我来自 .Net,我对 Java 开发还很陌生,所以这可能是个奇怪的问题:
我有一个 class 层次结构,例如:
Superclass implements GenericInterface<Superclass>
^
|
Subclass
其中 GenericInterface
非常简单:
public interface GenericInterface<T> {
OtherGenericInterface<T> getOther();
}
和OtherGenericInterface
最后使用类型参数:
public interface OtherGenericInterface<T> {
List<Object> processType(T left, T right);
}
现在,当我尝试在 Superclass
中实现接口时,我只是 return 一个匿名类型:
public class Superclass implements GenericInterface<Superclass> {
@Override
public OtherGenericInterface<Superclass> getOther() {
return new OtherGenericInterface<Superclass>() {
@Override
public List<Object> processType(T left, T right) {
...
}
};
}
}
到目前为止一切正常,但现在我尝试覆盖 Subclass
:
public class Subclass extends Superclass (implements GenericInterface<Subclass>) {
@Override
public OtherGenericInterface<Subclass> getOther() {
...
}
}
并且在那里,我无法使用更具体的 return 类型覆盖该方法。即使我重新实现接口并将 Superclass 中的方法声明为 final 也是不可能的。
所以我的问题是:为什么 OtherInterface<MoreSpecificType>
不是更具体的,或者至少是相同的类型(由于类型擦除),因为这将是重写方法的要求吗?
这表明了对 Java 泛型的一个常见误解 - 认为 class 的匹配也将匹配子 classes(如参数类型)。事实并非如此。 Java 泛型旨在确保类型 完全匹配 。如果你想要灵活的空间,你必须指定和定义你想要的房间和多少。
这是一个允许您通过将签名准确指定为 <T extends Superclass>
来执行您想要的操作的版本。这可能不是您要找的东西,但我希望它能为您指明正确的方向。
public interface OtherGenericInterface<T> {
List<Object> processType(T left, T right);
}
public interface GenericInterface<T> {
OtherGenericInterface<T> getOther();
}
public class Superclass<T extends Superclass> implements GenericInterface<T> {
@Override
public OtherGenericInterface<T> getOther() {
return new OtherGenericInterface<T>() {
@Override
public List<Object> processType(Superclass left, Superclass right) {
return null;
}
};
}
}
public class Subclass extends Superclass {
@Override
public OtherGenericInterface<Subclass> getOther() {
return null;
}
}