Java中的通用方法和类型推理

seg*_*ult 8 java generics type-inference

鉴于以下不是非常有用的代码:

package com.something;

import java.util.ArrayList;
import java.util.Collection;

//Not a generic class!
public class Test {

  public <T> void plain(T param1, T param2) {}
  public <T> void fancy(T param1, Collection<T> param2) {}

  public void testMethod() {

    //No error
    fancy("", new ArrayList<String>());

    //Compiler error here!
    fancy("", new ArrayList<Integer>());

    //No error
    plain("", new ArrayList<Integer>());

  }

}
Run Code Online (Sandbox Code Playgroud)

(如果错了,请纠正我的理解!)

第二次调用fancy()是编译器错误,因为Java无法推断两个参数之间的任何常见类型(无法推断,Object因为第二个参数必须是Collection.)

该呼叫plain()不是一个编译器错误,因为Java推断的普通型Object两个参数之间.

我最近遇到了类似于方法签名的代码plain().

我的问题是:

plain()的签名什么有用的东西?

也许编写该代码的人认为plain()签名会强制两个参数在编译时具有相同的类型,显然不是这种情况.

使用签名编写方法是否有任何区别或好处,plain()而不仅仅是将两个参数定义为Objects?

eri*_*son 4

虽然编译器不会推断出人们可能想要的泛型类型,但它强制执行显式指定的类型约束。以下调用会导致类型错误。

this.<String>plain("", new ArrayList<Integer>()); /* Compiler error. */
Run Code Online (Sandbox Code Playgroud)

Test 类型的参数化方法 <String>plain(String, String) 不适用于参数 (String, ArrayList<Integer>)