java – 为什么原始类型在一个地方导致其他地方的通用调用对象被视为原始的?

考虑这个例子:

import java.util.*;

class Foo<T> {
  public int baz(List<String> stringlist) { return 1; }
  public int baz(ArrayList<Object> objectlist) { return 2; }

  public static void main(String[] args) {
    Foo<String> foo = new Foo<String>(); // (A)
    //Foo foo = new Foo();               // (B)

    System.out.println(foo.baz(new ArrayList<String>()));
  }
}

为什么在(A)中打印1,而用(B)打印2?

我知道方法分辨率如何工作,所以不需要向我解释.

我想知道这个“功能”背后的更深层次的动机.
为什么没有擦除警告呢? (只有一个关于Foo foo = new Foo())

为什么方法分辨率使用擦除语义虽然通用类型是给定的?

这是因为当编译器为resolving overloads时,它将每个方法视为通用或非泛型,而不是两者的混合,所以候选者是:

> Foo< T> .baz(List< String>)
> Foo< T> .baz(ArrayList< Object>)

如果foo是Foo< String>或

> Foo.baz(列表)
> Foo.baz(ArrayList)

如果foo是Foo.

没有像Foo.baz(List< String>)这样的东西.所有类型参数都被考虑或没有. (我不知道这在JLS中被明确表示,但是从处理一个通用的方法就好像是原始的等价物是一个向后兼容的功能)是有意义的.

在第一种情况下,Foo< T> .baz(List< String>)匹配,但是Foo< T> .baz(ArrayList< Object>)没有.

在第二种情况下,两个函数都匹配,而Foo.baz(ArrayList)为more specific,因此被选中.

翻译自:https://stackoverflow.com/questions/6100332/why-do-raw-types-in-one-place-cause-generic-callsites-somewhere-else-to-be-treat

转载注明原文:java – 为什么原始类型在一个地方导致其他地方的通用调用对象被视为原始的?