【问题标题】:Why doesn't Java allow overloads based on type parameters?为什么 Java 不允许基于类型参数的重载?
【发布时间】:2013-07-11 01:35:27
【问题描述】:

我们可以在 .NET 中解决这个问题:

interface I<A> {}
interface I<A, B> {}

...但是在 Java 中,相同的代码会导致编译错误。

这很有趣,因为即使类型信息在运行时消失了,人们会期望关于类型参数数量的信息仍然存在。

如果此限制与类型擦除有关,有人可以解释原因吗?

【问题讨论】:

  • 限制是你不能多次定义一个接口并且你不能以这种方式重载它。在运行时,类型擦除将确保 I 实际上是不允许的相同类型,或者从技术上讲它不会做你想要的。

标签: java generics type-erasure


【解决方案1】:

它与类型擦除无关,而是与使用 raw type 时产生的歧义无关:

I eye = null;  // which 'I' is it?

为了适应在 JDK 5.0 中引入泛型之前编写的代码,允许使用原始类型。

【讨论】:

  • 所以问题不在于类型擦除本身,而只是 Java 允许使用原始类型,这基本上相当于将 Object 作为类型参数隐式传递?
  • .NET 如何解决这个问题?不允许使用原始类型?
  • 因此,如果 Java 想要解决这个问题,编译器可能会在这种情况下发出“模糊类型引用”错误,这与重载方法变得模糊时发生的方式相同。
  • ... 但是我们还需要一种不同的方式来编译东西,因为现在,没有办法让两个类具有相同的名称(但不同的类型重载)。对于方法,参数签名本质上是名称的一部分,因此它负责那里的重载。类没有这样的机制(现在可能很难使用)。
【解决方案2】:

在 java 中,泛型类/接口具有固定数量的泛型参数。这只是语言的定义方式。

与您所说的最接近的可能是:

interface I<A> {}
interface J<A, B> extends I<A> {}

J 的实例仍可分配给I 类型的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多