java 返回接口类型_关于java:接口中的方法级别通用返回类型

接口(对于返回类型)中的方法级泛型是否有意义? 他们有什么用吗? 例:-

public interface ABX {

public < T > T fx(String p);

}

我可以像这样简单地使通用类级别

public interface ABX< T > {

public T fx(String p);

}

在所有情况下,我都希望泛型在接口/抽象类(对于返回类型)中处于方法级别。

您所给出的示例基本上不会在任何地方有用,除非会产生麻烦,因为方法内部没有返回类型的上下文。这样的方法只能返回null以通过静态类型检查。

@Radiodef,但是第一个接口的实现可以定义具体的返回类型。

不,他们不能。在方法上声明类型参数会使方法本身具有多态性。调用该方法的代码是定义类型的地方,而不是实现的地方。

@Radiodef参见ideone.com/3Jn7Ab

那实际上并不安全。 ideone.com/U2cCDK编译器已经在向您发出警告。以这种方式进行的覆盖并不是参数化该方法,而是利用了以擦除方式覆盖工作的方式。 (您始终可以使用非泛型方法重写泛型方法,允许向后兼容,但绕过了泛型的类型检查功能。)

@Radiodef很好地解释了。谢谢。

这是另一个片段,以更清晰的方式说明了它的工作方式。 ideone.com/ofQVOc我们可以使用擦除来覆盖泛型方法,以便Java的非泛型版本可以扩展泛型类。 (不要问我为什么他们提出这个想法时认为它很重要。我个人认为它比任何东西都更令人困惑。)

@Radiodef因此,如果我不希望调用者决定返回类型,则泛型应该始终是类级别的对吗?

是的,这是正确的。

方法级别的泛型确实具有实用性。 但是您必须以某种方式绑定通用类型参数,因此通常这种方法将具有通用参数(如Class),然后返回通用值。 您的示例没有执行此操作,因此很难看到泛型类型参数的值。

您到处都能看到它们的示例-我遇到最多的是在Jackson数据绑定类ObjectMapper中-https://fasterxml.github.io/jackson-databind/javadoc/2.2.0/com/fasterxml/jackson /databind/ObjectMapper.html,例如

< T > T readValue(InputStream is, Class< T > returnType)

因此,这里的值是ObjectMapper不是通用类型的类,但它允许我绑定任何类(只要它可以理解该类以及如何根据输入来设置其各种属性)。 重要的一点是,对于整个应用程序,您只需要一个ObjectMapper实例,而对于可能需要进行数据绑定的每种类型的对象,则不需要一个实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值