相关疑难解决方法(0)

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

以下代码

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在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)));
    }
Run Code Online (Sandbox Code Playgroud)

它在eclipse和javac中编译.谁是正确的,eclipse编译器还是javac?

java eclipse generics

74
推荐指数
2
解决办法
3万
查看次数

将Class <T>强制转换为Class <E的最简单方法是扩展Enum <E >>而不丢失类型信息

我有一个方法createFoo(),为此创建Foo<T>使用Class<T>实例的实例T.现在我想扩展该方法以将使用枚举类型进行的调用转发给该方法createEnumFoo().从第一个方法调用第二个方法似乎是非平凡的.下面是我如何设法使用两个未经检查的强制转换和一个额外的方法,我想摆脱所有这些的例子.

该方法castEnumType()是必需的,因为我找不到一种方法来将a转换Class<?>为a Class<E extends Enum<E>>而没有E绑定某处.这涉及一个未经检查的演员,因为我还没有找到一种方法来使用它Class.asSubclass().在创建实例之后Foo,我需要将它从事件转换Foo<E>Foo<T>事件,E并且T将始终是相同的类型.

我无法削弱签名,createEnumFoo()因为它正在调用Enum.valueOf(enumType, ...)并要求其结果为类型E.

final class Example {
    <E extends Enum<E>> Foo<E> createEnumFoo(Class<E> enumType) {
        // This makes use of e.g. Enum.valueOf(enumType, ...).
        return null;
    }

    <E extends Enum<E>> Class<E> castEnumType(Class<?> enumType) {
        return (Class<E>) enumType;
    }

    <T> Foo<T> createFoo(Class<T> type) { …
Run Code Online (Sandbox Code Playgroud)

java generics enums casting

5
推荐指数
1
解决办法
778
查看次数

标签 统计

generics ×2

java ×2

casting ×1

eclipse ×1

enums ×1