我正在使用Java 6.
我无法让我的内部类使用与其封闭类相同的泛型类.目前我有
public class TernarySearchTree < T > {
...
protected class TSTNode < T > {
// index values for accessing relatives array
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected TSTNode < T > [] relatives;
private T data;
protected TSTNode(char splitchar, TSTNode < T > parent) {
this.splitchar = splitchar;
relatives = new TSTNode[4];
relatives[PARENT] = parent;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我收到了警告
类型参数T隐藏类型T.
如果我从内部类中删除类型参数(即<T> …
这并不像你想象的那样立即明白.
首先,虽然甲骨文已经停止了对Java 6的公众支持,截至2013年2月,但Premier支持将于2013年12月完成,而扩展支持将持续到2016年12月,这有点长尾.最重要的是,持续支持可以永远持续下去.
下一个主要的Java供应商IBM 似乎甚至没有发布对Java 6的支持(并且在2013年9月之前仍然支持Java 5!)
第三,我们有Apple:2013年6月目前最新的补丁和"该公司没有详细说明其黑白支持政策"似乎是任何人的猜测...但如果他们处理Java 5可以是作为基础我们可能会看到另外18个月左右... 2014年底 - 是吗?
最后我们有OpenJDK ...... Red Hat已经表示他们现在将支持 ......
我甚至没有开始考虑其他JVM实现只是在野外看到的更常见的!
所以从我所看到的,到目前为止,只要你有钱支付Oracle/IBM/Red Hat,你就可以继续获得无限期支持的Java 6版本......
也许我们可以开始更好地构建这个问题,并获得一个非无限期答案的机会:
如果您无法再购买特定JVM运行的硬件/操作系统,那么继续支持该特定JVM有点没有用处.扩展的支持合同适用于现有客户,他们现有的系统很可能满足他们现有的需求......如果他们不能更换为更新的
这实际上为我们提供了一些关于Apple的背景......由于Apple硬件支持5年(如果在加利福尼亚州为7),那么唯一受支持的Apple硬件应该是基于x86的硬件,因为交换机已于2006年12月完成(是最后一个基于PPC的硬件)苹果硬件出货),所以实际上我们不必担心在PPC上运行的Apple Java版本
同样,我们可以排除在旧版Windows上运行的任何Java版本.这意味着2014年4月如果Java安装程序无法在Windows 7+上运行,那么我们是否可以有效地忽略Windows XP支持的Java版本?
我真正感兴趣的是开发人员工具何时可以推进其最低Java版本.
一段时间以来,Jenkins一直保持对Java 5的支持,但更新的更新意味着1.520+需要Java 6或更高版本的主服务器和从服务器.如果某些构建从属(例如传统硬件)无法运行较新的JVM,则会导致问题.
Maven在将JVM分解为J2SE 1.3以运行单元测试方面有着悠久的历史,但从Surefire 2.15开始,它只支持与Java 5一样低的运行单元测试.
javac在移动到1和三回政策的条款-source和-target......所以我们需要等到JDK 10之前的Java 6的源文件支持从javac的下降......计划于2年的发行节奏和Java 8 2014年初发布,这将意味着2016年初的JDK9和2018年初的JDK10 ...但JDK9将在公开维护3年后可用,这意味着2019年的某个时候可能会删除JDK 6源代码兼容性.
是否有明确的日期可用于确定何时OSS开发人员工具链可以放弃对Java 7之前的JVM的支持,那个日期是什么?
OSS的区别非常重要,因为OSS开发人员通常没有资金来购买扩展/优质/维持型支持合同,而且很可能无法访问模糊/大型机硬件.
更新:通过"支持Java 7之前的JVM",我的意思是编译整个工具链是安全的,-target 7 …
我在Java 6中有一个正确编译的接口:
public interface IMultiMap<K, V> extends Map<K, Set<V>> {
public int valueSize();
public boolean put(K key, V value);
public void clear(Object key);
public boolean isEmpty(Object key);
}
Run Code Online (Sandbox Code Playgroud)
但在Java 7中,此接口无法编译.我得到一个编译错误boolean put(K, V),它具有相同的擦除V put(K, V).编译器的完整错误:
error: name clash: put(K#1,V#1) in IMultiMap and put(K#2,V#2) in Map have the same erasure, yet neither overrides the other
public boolean put(K key, V value);
where K#1,V#1,K#2,V#2 are type-variables:
K#1 extends Object declared in interface IMultiMap
V#1 extends Object declared in interface …Run Code Online (Sandbox Code Playgroud) 我正在解决一些Java难题,并偶然发现了这个:
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
Run Code Online (Sandbox Code Playgroud)
在编译此代码的同时,javac 1.6.0_45我正如预期的那样得到此错误:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
Run Code Online (Sandbox Code Playgroud)
这是因为编译器为Inner2具有类似代码的类生成默认构造函数,这解释了上面的错误:
Inner2 () {
this.super();
}
Run Code Online (Sandbox Code Playgroud)
现在很明显,因为你真的不能在Java 1.6.0_45,JLS 8.8.7.1中做到这一点(我可以猜到):
构造函数体中的显式构造函数调用语句可能不引用此类或任何超类中声明的任何实例变量或实例方法,或者在任何表达式中使用this或super; 否则,发生编译时错误.
请参阅(奇怪情况下接受的答案,"在调用超类型构造函数之前无法引用此内容")
但是,如果我尝试用javac 1.7.0_79它编译它- 它没关系!
这就是问题 - 在Java 1.7中已经改变了什么,这个代码现在是正确的?
提前致谢!
引入Java 7 WatchService用于持续监视文件系统.是否有Java 6的后端口?
是否有具有类似功能的纯Java库?
注意,您无法使用Java 1.7 jarsigner签署Android APK.所以我想知道为什么这是1.6和1.7签名者有什么区别?
在我的开发机器上,我总是需要安装Java 6 和 Java 7,我必须在32位和64位版本中安装每个JDK,以进行测试.由于Java更新的频率似乎变得越来越荒谬(现在每周两次?)每次更新都要求我取消然后重新安装4个 JDK.所以这真的很烦人,因此我想编写整个过程的脚本.
我的问题是,默认情况下,每个JDK版本都安装到包含update-number的目录路径中(默认值:"C:\ Program Files\Java\jdk1.6.0_ <update-nr> \").为了避免我不得不调整大量的构建脚本,我总是手动从安装路径中删除尾随的"_ <update-nr>"并始终安装到相同的"C:\ Program Files\Java\jdk1.6.0"或"C:\ Program Files\Java\jdk1.7.0",分别为64位版本和C:\ Program Files(x86)\ Java\jdk1.6.0"或"C:\ Program Files(x86)\Java\jdk1.7.0",对于32位版本,分别为.
我发现了,如何为JRE安装程序(即Java运行时)指定安装目录:
<jre-installfile>.exe [/s] [INSTALLDIR=<drive>:\<JRE_install_path>]
[STATIC=1] [WEB_JAVA=0/1] [WEB_JAVA_SECURITY_LEVEL=VH/H/M/L]
Run Code Online (Sandbox Code Playgroud)
我还没有找到类似的描述如何指定JDK安装程序的安装目录.
有谁知道是否以及如何指定JDK安装程序的安装路径,以便可以将静默JDK安装指向特定的安装目录?
以下代码在Java 1.6中编译良好,但无法在Java 1.7中编译.为什么?
代码的相关部分是对私有"数据"字段的引用.引用来自定义字段的同一类,因此看似合法.但它是通过一般类型的变量发生的.这段代码 - 一个基于内部库中的类的简化示例 - 在Java 1.6中工作,但现在不在Java 1.7中.
我不是在问这个如何解决这个问题.我已经做到了.我试图找到解释为什么这不再起作用的原因.我想到了三种可能性:
Foo.java:
import java.util.TreeMap;
import java.util.Map;
public abstract class Foo<V extends Foo<V>> {
private final Map<String,Object> data = new TreeMap<String,Object>();
protected Foo() { ; }
// Subclasses should implement this as 'return this;'
public abstract V getThis();
// Subclasses should implement this as 'return new SubclassOfFoo();'
public abstract V getEmpty();
// ... more methods here ...
public V copy() {
V x …Run Code Online (Sandbox Code Playgroud) 在以下示例中:
public static void main(String[] args) {
List<String> b = new ArrayList<String>();
first(b);
second(b);
List<List<String>> a = new ArrayList<List<String>>();
third(a);
fourth(a); // doesnt work
}
private static <T> void first(List<T> a){
System.out.println("List of T");
}
private static void second(List<?> a){
System.out.println("List of anything ");
}
private static <T> void third(List<List<T>> a){
System.out.println("List of a List of T ");
}
private static void fourth(List<List<?>> a){
System.out.println("List of a List of anything ");
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个(b)的呼叫有效,但第四个(a)的呼叫不起作用?
我收到以下错误:
The method fourth(List<List<?>>) in the …Run Code Online (Sandbox Code Playgroud) 我发现了类似的主题,但过于复杂,并不完全相同.事情就是这样.这是(最小)代码,它在1.6上很好,但不能用1.7 javac编译.
public class Test {
private static class A<T>{};
private static class B{};
private static class C{};
B doSomething(A<B> arg){
return new B();
}
C doSomething(A<C> arg){
return new C();
}
}
Run Code Online (Sandbox Code Playgroud)
在1.7上错误是这样的:
java: name clash: doSomething(Test.A<Test.C>) and doSomething(Test.A<Test.B>) have the same erasure
Run Code Online (Sandbox Code Playgroud)
我理解类型擦除以及为什么它是错误的代码.我只是不明白为什么我们可以在我们的项目中编译和运行1.6中的代码,当1.7有问题时.怎么了?这是1.6编译器中的一个错误,它允许我们这样做吗?是否有可能使其在重写以外的1.7中工作?