eclipse编译器或javac中的错误(“无法确定T的类型参数”)


74

以下代码

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 file)更改为

    @SuppressWarnings("unchecked")
    public static <T> T readObject(String file) throws Exception {
        return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
    }

它可以在eclipse和javac中进行编译。谁是正确的,eclipse编译器还是javac?

Answers:


66

我会说这是在此处此处报告的Sun编译器中的错误,因为如果将行更改为下面的行,则这两者都可以使用,这似乎正是错误报告中所描述的。

return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));

13

在这种情况下,我会说您的代码是错误的(Sun编译器是正确的)。您的输入参数中没有任何内容readObject可以实际推断出类型T。在这种情况下,最好让它返回Object,并让客户端手动强制转换结果类型。

这应该可以工作(尽管我还没有测试过):

public static <T> T readObject(String file) throws Exception {
    return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
}

1
<T> readObject(new ObjectInputStream(new FileInputStream(file)));返回GenericsTest2。确实有效。谢谢!
Tobias Schulte

1
我不同意,它看起来更像下面的错误。编译器应该信任无类型推断的显式转换-以下代码可以很好地编译@SuppressWarnings(“ unchecked”)public static <T> T createT(String className)抛出异常{return(T)Class.forName(className).newInstance() ; }
Duncan McGregor

3

Oracle JDK6 u22应该是正确的,但我也有JDK6 u24这个问题

这是eclipse错误98379的错误

此问题尚未得到纠正,但是可以通过解决方法来解决问题,例如eclipse bug中的示例(请参阅链接)


1

我在Java版本“ 1.6.0_22”中发现了此问题。当我升级到Java版本“ 1.6.0_32”时,它消失了,因为它已在更新25中修复。


0

如果可以将方法readObject修改为在调用时透明地工作,则还可以使用以下方法:

public static <T> T readObject(String file, Class<T> type) throws Exception {
    return type.cast(readObject(new ObjectInputStream(new FileInputStream(file))));
}

这样,调用者被迫指定结果的类型,并且编译器知道如何转换结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.