考虑 JLS 中的以下条款(§15.9)
如果类实例创建表达式向构造函数提供类型参数但使用菱形形式作为类的类型参数,则这是一个编译时错误。
不允许这样做的原因如下
引入此规则是因为泛型类的类型参数的推断可能会影响对泛型构造函数的类型参数的约束。
不太清楚为什么会这样说 - 在泛型类和泛型构造函数的情况下考虑以下类型参数的典型用法:
class Scratch<T,R> {
public <K> Scratch(K k, T t, R r){
}
public static void main(String[] args) {
Scratch<Integer,Double> dd = new <String>Scratch<>("abdc",33,33.4); //compile error
}
}
在这里,我们有以下内容:
- 仅构造函数的类型参数是 K 而类是 {T,R}
- 所有这些类型彼此不同——当使用菱形运算符时——类类型不能与为构造函数的类型参数指定的类型发生冲突。
那么上述“在提供构造函数的类型参数时不允许使用菱形运算符”的原因如何有效?. 我在这里错过了什么吗?