在eclipse编译器或javac中的错误(“T的types参数无法确定”)
下面的代码
public class GenericsTest2 { public static void main(String[] args) throws Exception { Integer i = readObject(args[0]); System.out.println(i); } public static <T> T readObject(String file) throws Exception { return readObject(new ObjectInputStream(new FileInputStream(file))); // closing the stream in finally removed to get a small example } @SuppressWarnings("unchecked") public static <T> T readObject(ObjectInputStream stream) throws Exception { return (T)stream.readObject(); } }
在eclipse中编译,而不是在javac中(T的types参数不能确定;上限为T,java.lang.Object的typesvariablesT不存在唯一的最大实例)。
当我将readObject(String file)更改为
@SuppressWarnings("unchecked") public static <T> T readObject(String file) throws Exception { return (T)readObject(new ObjectInputStream(new FileInputStream(file))); }
它在eclipse和javac中编译。 谁是正确的,eclipse编译器还是javac?
我想说这是Sun编译器在这里和这里所报告的错误,因为如果您将行更改为下面的行,那么这两个行都适用,这看起来正是bug报告中所描述的。
return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
在这种情况下,我会说你的代码是错误的(而Sun编译器是正确的)。 你的input参数中没有任何东西readObject
来实际推断typesT
在这种情况下,最好让它返回Object,并让客户端手动转换结果types。
这应该工作(虽然我没有testing过):
public static <T> T readObject(String file) throws Exception { return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file))); }
Oracle JDK6 u22应该是正确的,但我也有JDK6 u24的这个问题
这是eclipse bug 98379的一个bug。
这没有得到解决,但问题通过解决方法,例如在Eclipse的错误(请参阅链接)
我在java版本“1.6.0_22”中发现了这个问题。 当我升级到Java版本“1.6.0_32”时它消失了,因为它在更新25中被修复了。
如果您可以修改您的方法readObject以便在调用时透明地工作,则还可以使用以下内容:
public static <T> T readObject(String file, Class<T> type) throws Exception { return type.cast(readObject(new ObjectInputStream(new FileInputStream(file)))); }
这样,调用者被迫指定结果的types,编译器知道如何转换结果。
- org.apache.tomcat.util.bcel.classfile.ClassFormatException:常量池中的无效字节标记:15
- 在Eclipse的工作区中快速find一个字段或方法
- 升级到Ubuntu 13.10后,Eclipse菜单不显示
- 有用的Eclipse Java代码模板
- 错误:无法打开类文件R.java
- 在“更新Maven项目”期间发生内部错误。 显示java.lang.NullPointerException
- Eclipse,Subclipse和Subversive的SVN插件的优点和缺点是什么?
- zipalign工具没有在SDK中find
- 为从Eclipse运行的所有JUnittesting指定自定义log4j.properties文件