当前位置: 首页 > 面试题库 >

new之后的构造函数调用中的类型实参的目的是什么?

周楷
2023-03-14
问题内容

在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

在这些简单的示例中,尽管第一个参数列表解析并检查了其参数的有效性,但似乎没有做任何有意义的事情。


问题答案:

构造函数也可以声明类型参数

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

失败于

Main.Foo类型的参数化构造函数Foo(Integer,String)不适用于参数(Integer,Object)

在你的最后

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

NotDefined只是在编译过程中找不到的类型。如果是的话,只会警告您它是unused



 类似资料:
  • 上这个简单的课... JLS的第8.8.9节指出,“如果一个类不包含构造函数声明,那么默认构造函数将被隐式声明。”它还说,只要我们不在类中,那么“默认构造函数只是调用没有参数的超类构造函数。” 因此,因为类扩展了,我们被迫通过调用的构造函数,作为隐式创建的默认构造函数的一部分。 同样地... 即使我们显式地为Gen声明构造函数,JLS的第8.8.7节规定“如果构造函数体不是以显式构造函数调用开始,

  • 问题内容: 如果我有一个像这样的抽象类: 还有一些从Item派生的类是这样的: 我不明白为什么我不能使用泛型调用构造函数: 我知道可以有一个没有构造函数的类型,但是这种情况是不可能的,因为Pencil具有没有参数的构造函数,而Item是抽象的。但是我从eclipse中得到了这个错误: 无法实例化 我不明白为什么的 T类型 ,以及如何避免这种情况? 问题答案: 无法使用Java类型系统来强制类层次结

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,

  • 我有一个类,它有一些属性/方法,返回最初通过构造函数传递的值: 人们建议用泛型作为打字稿的等价物: 现在我有了一个子类,它调用超类的构造函数并传递以下选项: TypeScript编译器对此不满意,希望通过类型扩展Base类。但是我有两次信息,在超级呼叫和扩展符号中。什么是正确的ts语法来解决我的问题? (键入脚本中的代码)

  • 我最近遇到了这种不同寻常的Java语法。。。下面是一个例子: 注意

  • 我有一个有两个构造函数的类。 有一个具有两个构造函数的类Sample。需要在Sample类中实例化另外三个类(ClassOne,ClassTwo和ClassIII)。所有三个类都包含默认和参数化构造函数。如果调用了Sample类的默认构造函数,则应调用ClassOne,ClassTwo和ClassIII的默认辅助构造函数。如果调用Samples参数化构造函数,则调用ClassOne、ClassII