java - Java 中的泛型方法和类型推断

标签 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>());

  }

}

(理解有误请指正!)

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

plain() 的调用不是编译器错误,因为 Java 会在两个参数之间推断出 Object 的公共(public)类型。

我最近发现代码的方法签名类似于 plain()

我的问题是:

plain() 的签名有什么用吗?

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

编写带有像 plain() 这样的签名的方法而不是仅仅将两个参数都定义为 Object 有什么区别或好处吗?

最佳答案

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

this.<String>plain("", new ArrayList<Integer>()); /* Compiler error. */

The parameterized method <String>plain(String, String) of type Test is not applicable for the arguments (String, ArrayList<Integer>)

关于java - Java 中的泛型方法和类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11513650/

相关文章:

java - 泛型 0 无法转换为 java.lang.Short

java - 类中的类型 "place"是什么意思?

java - 错误 : Could not find or load main class when JAVA_OPTS in setenv. sh

java - Jsoup运行时错误: Exception in thread "main" java. lang.NoClassDefFoundError

java - int 变量保持为 0,导致 while 循环无法正常运行

java - 将泛型类型乘以二 - 二叉树方法

java - 在 Android 中处理 Google+ 登录

c# - 为什么 C# 编译器不能推导出返回值的类型参数?

scala - 创建部分应用函数时的类型推断

java - 枚举、接口(interface)和 (Java 8) lambdas : code compiles but fails at runtime; is this expected?