我在非泛型类中创建了一个具有两种类型参数的泛型方法,如下所示:
static <T, V extends T> boolean testMethod(T t, V[] v) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
第二个类型参数定义为V extends T。
现在考虑通过以下参数调用此方法:
testMethod("text", new Integer[]{1, 2});
Run Code Online (Sandbox Code Playgroud)
当我尝试使用上述参数调用此方法时,我预计会出现类型不匹配的错误,因为类型参数T替换为String和V替换为Integer和 正如您所见,它的V边界是T,这意味着它必须是 String 类型或其派生类,但必须是 Integer不属于其中。但代码段编译运行成功,没有任何问题。
有人可以解释一下我对这个概念的印象有什么问题吗?
T在此方法调用中,和类型参数的值V未显式提供,因此编译器会推断它们。它总是会在返回错误之前尝试推断有效的替换,即使结果并不总是直观的。在此示例中,该值\xe2\x80\x9ctext\xe2\x80\x9d是 a String,是的,但它也是一个Object。由于推理T = String, V = Integer无效,因为Integer不是 的子类型String,因此编译器使用T = Object, V = Integer,这是有效的。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |