java – 在新建的构造函数中调用类型参数的目的是什么?

Java规范( http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9)中,new具有以下形式:
ClassInstanceCreationExpression ::=
| new TypeArguments_opt TypeDeclSpecifier TypeArgumentsOrDiamond_opt
    ( ArgumentListopt ) ClassBodyopt
| Primary . new TypeArguments_opt Identifier TypeArgumentsOrDiamond_opt
    ( ArgumentListopt ) ClassBodyopt

新的第一个可选类型参数列表的目的是什么?我无法从我阅读的第15.9节(所有引用类型参数列表的引用看起来都引用了类型/标识符之后的列表).测试标准Java编译器上的随机位会产生混乱的结果:

public class Foo<T> { }
// ...
Foo<Integer> t1 = new <Integer> Foo<Integer>();  // works
Foo<Integer> t2 = new <Integer> Foo();           // works -- unchecked warning missing the type arg after Foo
Foo<Integer> t3 = new <Boolean> Foo<Integer>();  // works
Foo<Integer> t4 = new <Float,Boolean> Foo<Integer>();  // works
Foo<Integer> t5 = new <NotDefined> Foo<Integer>();  // fails -- NotDefined is undefined

在这些简单的例子上,似乎这个第一个参数列表没有任何意义,尽管它解析和检查其参数的有效性.

@H_301_11@解决方法
构造函数也可以声明类型参数
public class Main {     
    public static class Foo<T> {
        public <E> Foo(T object,E object2) {

        }
    }
    public static void main(String[] args) throws Exception {
        Foo<Integer> foo = new <String> Foo<Integer>(1,"hello");           
    }    
}

这就是< String>在构造函数调用之前是为.它是构造函数的类型参数.

下列

Foo<Integer> foo = new <String> Foo<Integer>(1,new Object());

失败了

The parameterized constructor Foo(Integer,String) of type
Main.Foo is not applicable for the arguments (Integer,
Object)

在你的最后

Foo<Integer> t5 = new <NotDefined> Foo<Integer>();  // fails -- NotDefined is undefined

NotDefined不是在编译期间找到的类型.如果是,它只会给你一个警告,它没有使用.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...