![](/img/trans.png)
[英]Error: type parameters of <T>T cannot be determined during Maven Install
[英]Bug in eclipse compiler or in javac (“type parameters of T cannot be determined”)
以下代码
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的类型参数无法确定;对于具有上限T,java.lang.Object的类型变量T,不存在唯一的最大实例)。
当我将readObject(String文件)更改为
@SuppressWarnings("unchecked")
public static <T> T readObject(String file) throws Exception {
return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
}
它在eclipse和javac中编译。 谁是正确的,eclipse编译器还是javac?
在这种情况下,我会说你的代码是错误的(Sun编译器是对的)。 您的输入参数中没有任何内容可以使readObject
实际推断出类型T
在这种情况下,最好让它返回Object,并让客户端手动转换结果类型。
这应该工作(虽然我还没有测试过):
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))));
}
这样,调用者被迫指定结果的类型,编译器知道如何转换结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.