【问题标题】:Method parametrized with one type accepts two types用一种类型参数化的方法接受两种类型
【发布时间】:2016-09-23 16:54:27
【问题描述】:

可能我遗漏了一些东西,也许我的假设是错误的,但我认为当我声明类型为 T 的参数化方法时,无论该类型有多少变量,它仍然是相同的类型。但我看到这是编译的,它反对我的观点。

static <T> void f(T a, T b) { }

public static void main(String[] args) {
    f(Integer.MIN_VALUE, "...");
}

因此,如果我的方法使用一种类型进行参数化,并且我在两个参数中使用该一种类型,为什么它允许我发送具有两种完全不同类型的两个对象?我想这归结为将T 视为Object

【问题讨论】:

  • “我猜它归结为将 T 视为对象?”是的。你也可以声明static void f(Object a, Object b) {}
  • 更有趣的是,类型擦除甚至会擦除像static &lt;T, S extends T&gt; void f(T a, S b) { ... }这样的结构

标签: java generics methods


【解决方案1】:

尽管 Integer 和 String 是两种不同的类型,但它们仍然共享一个共同的超类型。 Serializable.

为了验证这一点,让我们返回T

static <T> T f(T a, T b) {
    return null;
}
Serializable s = f(Integer.MIN_VALUE, "..."); // compiles

编译器将解析(或推断,不确定技术术语)为最具体的类型。例如,

Number number = f(Integer.MAX_VALUE, BigDecimal.ONE); 

现在,解析的类型是 Number,因为这两种类型都是 Number 的子类型,当然还有 SerializableObject

【讨论】:

  • 我相信常见的超类型其实是Object。它可以在除了Object 之外没有共同超类型的类的两个实例上编译良好。
  • @Casey 请检查我的编辑。当然 Object 很常见,但 Serializable 更具体
猜你喜欢
  • 2016-01-25
  • 2012-06-02
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2012-05-28
  • 2016-09-18
  • 2017-01-30
相关资源
最近更新 更多