Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个菱形符号的解释?_Java_Generics_Diamond Operator - Fatal编程技术网

Java 这个菱形符号的解释?

Java 这个菱形符号的解释?,java,generics,diamond-operator,Java,Generics,Diamond Operator,从JavaJDK1.7官方指南中,我得到了这句话,但我不明白它是如何工作的。有人能解释一下吗?换句话说,当菱形传递空字符串时,它如何推断整数类型 MyClass myObject=newmyclass(“”); 在本例中,编译器为形式化 泛型类MyClass的类型参数X。它推断出了类型 此函数的构造函数的形式类型参数T的字符串 泛型类 Integer部分是从构造函数调用结果的使用中推断出来的-它被分配给MyClass类型的变量,因此Integer部分是为菱形推断出来的。构造函数参数与此无关(除

从JavaJDK1.7官方指南中,我得到了这句话,但我不明白它是如何工作的。有人能解释一下吗?换句话说,当菱形传递空字符串时,它如何推断整数类型

MyClass myObject=newmyclass(“”);
在本例中,编译器为形式化 泛型类MyClass的类型参数X。它推断出了类型 此函数的构造函数的形式类型参数T的字符串 泛型类


Integer
部分是从构造函数调用结果的使用中推断出来的-它被分配给
MyClass
类型的变量,因此
Integer
部分是为菱形推断出来的。构造函数参数与此无关(除非它必须是相同的类型,在这种情况下,只会出现编译错误)


基本上,如果类型参数在使用表达式的上下文中是明确的(其中“clear”当然意味着“遵循精确的规则”),那么编译器将对其进行推断。

整数部分是从构造函数调用结果的使用中推断出来的-它将赋值给类型为
MyClass
的变量,因此,将为菱形推断
整数
部分。构造函数参数与此无关(除非它必须是相同的类型,在这种情况下,只会出现编译错误)


基本上,如果类型参数在使用表达式的上下文中是明确的(其中“clear”当然意味着“遵循精确的规则”),那么编译器将推断它。

引号表示类中有一个泛型构造函数,它声明了自己的类型参数。这类似于创建泛型方法的方式。构造函数的类型参数是从实例化类时传递的参数推断出来的

下面是与该调用匹配的类的简单版本:

 class MyClass<T> {
    <S> MyClass(S arg) {
        System.out.println(arg);
    }
 }
class-MyClass{
MyClass(S arg){
系统输出打印项次(arg);
}
}
现在,当您在代码中实例化类时,根据您传递的参数,类型参数
T
被推断为
Integer
,构造函数中的类型参数
S
被推断为
String


至于diamond操作符,从Java7开始,如果已经在为引用分配引用,则在创建泛型类的实例时不需要提供类型参数。类型参数将从引用类型使用的参数中推断出来,这里的
Integer

引号表示类中有一个泛型构造函数,它声明了自己的类型参数。这类似于创建泛型方法的方式。构造函数的类型参数是从实例化类时传递的参数推断出来的

下面是与该调用匹配的类的简单版本:

 class MyClass<T> {
    <S> MyClass(S arg) {
        System.out.println(arg);
    }
 }
class-MyClass{
MyClass(S arg){
系统输出打印项次(arg);
}
}
现在,当您在代码中实例化类时,根据您传递的参数,类型参数
T
被推断为
Integer
,构造函数中的类型参数
S
被推断为
String


至于diamond操作符,从Java7开始,如果已经在为引用分配引用,则在创建泛型类的实例时不需要提供类型参数。类型参数将从引用类型中使用的参数推断出来,这里是
Integer

Ok。这是有道理的。它们没有显示MyClass的返回类型。这是否意味着MyClass的构造函数中包含一个“返回整数”?如果右边写着“newmyclass(“”.getInt();”@djangofan:没有“返回类型”-您正在调用构造函数,那么对我来说就更有意义了。构造函数总是返回要调用其构造函数的类型。Ok。这是有道理的。它们没有显示MyClass的返回类型。这是否意味着MyClass的构造函数中包含一个“返回整数”?如果右边写着“newmyclass(“”.getInt();”@djangofan:没有“返回类型”-您正在调用构造函数,那么对我来说就更有意义了。构造函数总是返回您调用其构造函数的类型。我理解MyClass部分和“MyClass(S arg)”部分,但我不理解System.out.println(arg)是如何执行的;某种程度上与“T”型有关。你不需要一个“返回整数”类型的东西吗?@djangofan是的。区别在于范围。
T
的作用域是整个类(当然是所有非静态成员),而
S
的作用域只是构造函数。@djangofan构造函数不返回任何内容。它的工作是初始化对象。在内部,构造函数被转换为返回类型为
void
的实例方法。您的两个注释都非常有意义。不过我还是不太明白;让我猜猜:不管传递给它的字符串是什么,生成的名为“MyClass”的整数对象都有一个默认值0?@djangofan,如果您有一个类型为
T
like-
T obj的实例变量Integer
类型参数,它将具有默认值
null
。它不会是
0
。您可以尝试添加一个字段,并为其添加一个getter。然后调用实例的getter,我理解MyClass部分和“MyClass(S arg)”部分,但我不理解System.out.println(arg)是如何实现的;某种程度上与“T”型有关。你不需要一个“返回整数”类型的东西吗?@djangofan是的。区别在于范围。
T
的作用域是整个类(当然是所有非静态成员),而
S
的作用域只是构造函数。@djangofan构造函数就是这样做的