【发布时间】:2016-01-05 21:02:32
【问题描述】:
接口(用于返回类型)中的方法级泛型是否有意义?它们有什么用吗?示例:-
public interface ABX {
public <T> T fx(String p);
}
我可以像这样简单地制作通用类级别
public interface ABX<T> {
public T fx(String p);
}
在任何情况下我都希望泛型在接口/抽象类中是方法级别的(对于返回类型)。
【问题讨论】:
-
您给出的示例基本上在任何地方都没有用,除了作为一个杂物,因为方法内部没有返回类型的上下文。这样的方法只能返回
null才能通过静态类型检查。 -
@Radiodef 但第一个接口的实现可以定义具体的返回类型。
-
不,他们不能。在方法上声明类型参数会使方法本身具有多态性。调用方法的代码是定义类型的地方,而不是实现。
-
这实际上并不安全。 ideone.com/U2cCDK 编译器已经给你一个警告。以这种方式覆盖不是参数化方法,它利用了覆盖与擦除一起工作的方式。 (您始终可以用非泛型方法覆盖泛型方法,这允许向后兼容,但会绕过泛型的类型检查功能。)
-
这是另一个 sn-p,它以更清晰的方式解释了它是如何工作的。 ideone.com/ofQVOc 我们可以用擦除来覆盖泛型方法,以便 Java 的非泛型版本可以扩展泛型类。 (不要问我为什么在他们提出这个问题时认为这很重要。我个人认为这比任何事情都更令人困惑。)