我有一个Java 1.6 Android项目。我有一个不编译的第三方代码:
import org.springframework.http.HttpEntity;
//...
HttpHeaders requestHeaders = new HttpHeaders();
//...
new HttpEntity<>(requestHeaders);
它说:'&lt;&gt;'操作员不允许源级别低于1.7
我不想将我的项目切换到1.7。我已将该行更改为
new HttpEntity<Object>(requestHeaders);
现在编译得很好。
但我的修正是否正确? Java 1.7对空括号做了什么?
更新
将新对象传递给接受HttpEntity<?>
参数的函数。我理解类型推断的想法,但我不明白1.7编译器从给定的代码行推断出什么。
答案 0 :(得分:7)
你错过了那一行的第一部分,我确定没有创建一个HttpEntity来扔掉它(检查它保存到的引用的类型)。
Java&lt; 1.7要求:
SomeGenericClass<String> foo = new SomeGenericClass<String>();
Java 1.7允许这作为简写:
SomeGenericClass<String> foo = new SomeGenericClass<>();
答案 1 :(得分:3)
你的修复几乎是正确的,无论如何都不危险。
Object
是层次结构的根,&lt;&gt;表示“让编译器推断出类型”,因此任何在1.7中推断的类型都是Object
的特化。
看到您的更新后:<?>
实际上意味着“通配符”(see here),因此Object
没问题。
答案 2 :(得分:2)
钻石操作员只是想减少不必要的工作,即不必在作业中输入通用。
而不是
ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<MyClassWithThatStupidLongName>();
你可以使用:
ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<>();
然而,这是在Java 7中引入的,并且由于您似乎需要使用适用于较低版本的代码,因此您必须重新添加所有这些Generics,就像我的第一个列表一样。
答案 3 :(得分:1)
您的修复是正确的。最好使用'HttpEntitiy。
的确切(通用)类型 <>
运算符背后的想法只是为了减少编译器可以隐式地从代码中推断泛型类型的地方的详细程度。
如此post
中所述钻石运营商减少了Java的一些冗长 通过让编译器推断构造函数的参数类型来进行泛型 通用类
对此类运算符的需求来自于声明泛型类型的新实例的冗长。在1.7之前的Java版本中,您必须以这种方式定义泛型:
List<MyClass> myClassCollection = new List<MyClass>();
这显然是多余的,因为编译器可以很容易地理解在构造对象时应该的类型。
此运算符带来的另一个重大改进是返回泛型类型:
在java 1.7之前:
public List<MyClass> getMyClassCollection() {
if(some condition) {
return new ArrayList<MyClass>();
} else {
return LinkedList<MyClass>();
}
}
在java 1.7之后:
public List<MyClass> getMyClassCollection() {
if(some condition) {
return new ArrayList<>();
} else {
return LinkedList<>();
}
}
这可能看似微不足道,但实际上可能存在流量,您可以在其中省略一些此类声明。当您想要更改代码时,巨大的优势就来了。如果您现在更改方法以返回List<MyClassChild>
(其中MyClassChild
延伸MyClass
),您只需要更改一个地方而不是几个地方。