【发布时间】:2021-02-14 14:18:48
【问题描述】:
我有一个泛型方法要返回泛型类型。我想正确调用它以返回编译错误,以防我使用它的返回类型不符合边界,从而避免运行时错误(与编译相比)并使用 Java 泛型类型的所有功能。
public <T extends IDeserializable> T restoreObject(byte[] objectArray) {
T object = T.getDeserialized(objectArray);
return object;
}
但是,这样称呼它
File ret = restoreObject(new byte[] {1,2,3});
不会产生编译错误,因此错误只会在运行时产生。 File 类型没有实现 IDeserializable,但是 java 不会产生编译错误。
public interface IDeserializable {
public static <T> T getDeserialized(byte[] data) {
return null;
}
}
【问题讨论】:
-
第 2 行无法编译:
T.getDeserialized(objectArray);不是有效的 java。 -
而 java 不知道这不会成功,因为您可能定义了一个类
class Something extends File implements IDeserializable,这将使分配工作。 -
不,它不会编译,因为
T不作为类型或实例存在,除了强制转换为 T 之外,您不能对 T 做任何事情。如果它存在,它将是类型,而不是实现方法或符合任何东西的实例。 -
谢谢。你说的对。它在界面中是静态的。更新了问题中的界面。
-
但是现在你在 java 能做什么方面又一次不走运了。该接口中的静态方法不能被覆盖,并且将永远保留
return null或您在那里拥有的任何其他特定主体。但是类A implements IDeserializable与B implements IDeserializable相比不能有不同的主体/逻辑,这使得该方法对您的用例完全无用。