java 7中的菱形运算符允许以下代码:
List<String> list = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)
但是在Java 5/6中,我可以简单地写:
List<String> list = new LinkedList();
Run Code Online (Sandbox Code Playgroud)
我对类型擦除的理解是这些完全相同.(无论如何,通用都会在运行时删除).
为什么要钻石头呢?它允许哪些新功能/类型安全?如果它没有产生任何新功能,为什么他们将其作为功能提及?我对这个概念的理解是否有缺陷?
考虑这个尝试实例化某些List
s的Java代码:
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<String>() { };
List<String> list4 = new ArrayList<>() { };
List<String> list5 = new ArrayList<Integer>() { };
Run Code Online (Sandbox Code Playgroud)
list1
并且list2
很简单; list2
在Java 7中使用新的菱形运算符来减少不必要的类型参数重复.
list3
是list1
使用匿名类的变体,可能会覆盖一些方法ArrayList
.
list4
尝试使用菱形运算符,类似于list2
,但这是一个编译错误,消息'<>'不能与匿名类一起使用.
list5
产生一个错误,证明编译器知道实际需要什么类型.错误消息是类型不匹配:无法从新的ArrayList <Integer>(){}转换为List <String>
那么,随着声明list4
,为什么钻石运算符不能用于匿名类?这里有一个类似的问题,接受的答案包含JSR-334的以下解释:
不支持使用带有匿名内部类的菱形,因为这样做通常需要扩展类文件签名属性以表示不可表示的类型,事实上的JVM更改.
我需要一些帮助来理解推理.为什么显式类型与相同且明显容易推断的类型需要在生成的类文件中有任何差异?"一般这样做"会涵盖哪些难以处理的用例?
从JEP 286开始,我们看到我们将能够var
在JDK 10(18.3)中使用本地类型推理().JEP表示以下编译,这是预期的:
var list = new ArrayList<String>(); // infers ArrayList<String>
Run Code Online (Sandbox Code Playgroud)
我很想知道如果我们尝试以下内容会发生什么:
var list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
我在第二个片段中提出的建议是否会编译?如果是这样(我怀疑),ArrayList
接受是否Object
为通用类型?
我自己尝试一下,但我无法访问任何我可以安装早期版本的机器.
谢谢!
我正在使用Android Studio,我写这个:
List<Button> buttons = new ArrayList<Button>();
Run Code Online (Sandbox Code Playgroud)
我有这样的信息:
显式类型参数Button应替换为<>
我好奇,为什么用钻石代替呢?
List<Button> buttons = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
编辑:
我完全不同意副本!之前我看到了那个答案,它将显式参数与无参数进行比较,而我将显式参数与隐式参数进行比较!
我有一个类型为patient_class的arraylist,并且arraylist类型用黄色加下划线,IDE提到了"新表达式中的冗余类型参数(使用菱形运算符代替)".
我的问题是:我应该使用钻石操作员吗?这是必须的吗?将记录存储到arraylist时,是否会出现任何数据丢失或任何其他问题?
这是我的arraylist:
public class Register_newpatient extends javax.swing.JFrame {
public Register_newpatient() {
initComponents();
groupbutton();
}
public void groupbutton()
{
ButtonGroup bg1=new ButtonGroup();
bg1.add(rbopd);
bg1.add(rbinpatientcare);
bg1.add(rbboth);
}
all_error_handling checkerror = new all_error_handling();
JFrame frame = new JFrame();
static ArrayList<patient_class>patientlist = new ArrayList<patient_class>();
Run Code Online (Sandbox Code Playgroud)
说实话,我不知道钻石操作员究竟是什么.
我在尝试编译ide ide中的一些简单源代码时遇到此错误.
java: diamond operator is not supported in -source 1.6 (use -source 7 or higher to enable diamond operator)
Run Code Online (Sandbox Code Playgroud)
来自oracle的jdk是1.7.40
但这个地方添加这个"-source 7"选项在哪里?
我尝试添加ide设置,但没有效果.
我观看了Oracle OTN虚拟事件:Java SE和JavaFX 2.0(2012年2月28日),在谈到新的钻石操作员(那Map<String, List<String>> myMap = new HashMap<>();
件事)时,发言者提到它并不像人们想象的那样简单,因为它不是简单的令牌替换.
我的问题是为什么?为什么不能简单地从变量声明中取出字符串并将其放入菱形运算符中?
我正在使用Perl的菱形 <>
运算符来读取命令行中指定的文件.
我希望能够报告类似的消息"Trouble on line $. of file $FILENAME"
,但是如何判断钻石当前使用的是哪个文件?
这个问题的答案描述了如何伪输入<STDIN>
.我的目标与那个问题类似:我的单元测试需要假输入<>
.
当我将相同的技术应用于假输入时<>
,它不起作用.介绍级别的解释<>
让我相信它是在命令行上没有给出文件时从STDIN读取的,但似乎并非如此.
我试图做的样本:
#!/usr/bin/perl -w
use strict;
use warnings;
use Carp;
use English qw( -no_match_vars );
sub fake1 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;
my $line = <>;
print "fake1 line is $line\n";
return 0;
}
sub fake2 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN …
Run Code Online (Sandbox Code Playgroud) 我刚刚开始研究Java项目,并且已经使用IntelliJ从GitHub下载了源代码 - 我之前从未使用过IntelliJ,但是我被告知它比Eclipse更好用(我正在使用它)当我上次做任何Java开发时 - 大约四年前).
当我尝试在我的计算机上本地构建源代码时,从GitHub中提取了最新的工作版本,我在几个不同的代码行上得到了编译错误 - 错误说:
错误:(27,34)java:在-source 1.5中不支持菱形运算符(使用-source 7或更高版本来启用菱形运算符)
以及出现这些编译错误的行是:
return new ArrayList<>(0);
Run Code Online (Sandbox Code Playgroud)
如果我选择该行,并对Alt + Enter
错误执行操作,则会显示一条消息,指出我可以
"将语言级别设置为7-钻石,ARM,多缓存等"
但是,如果我选择此选项,则没有任何反应......
在该pom.xml
文件中,有以下xml:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>${maven-source-plugin.version}</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但是当我看到这个错误时,我遇到了答案:在这个语言级别不支持Diamond类型,这表明我应该使用maven1.7或更高版本,并且看起来该项目已经在使用版本1.8,所以我不明白为什么我得到这个编译错误...
有人有什么建议吗?