Eclipse中的通用方法调用

时间:2011-08-19 21:06:47

标签: eclipse generics

试图在IDEA中运行一个项目并获得例外。之前该项目始终只在Eclipse上运行。

以下是示例代码:

package com.test;

public class GenericMethod {

    private Object value;

    @SuppressWarnings("unchecked")
    public <X> X getValue() {
        return (X) value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

使用它的类:

package com.test;

public class GenericMethodTest {

    public static void main(String[] args) {
        GenericMethod method = new GenericMethod();
        method.setValue(3);

        int[] array = new int[] {1, 2};

        array[0] = method.getValue();
        System.out.println(array[0]);
    }
}

因此,如果您尝试在Eclipse中运行此示例 - 一切正常。它会编译并显示正确的结果。

但是,如果您尝试在IDEA中运行它,或者如果您只是使用ant或您的控制台和javac命令 - 那么您将收到编译错误:

Buildfile: C:\test\build.xml

build:
    [javac] C:\test\build.xml:13: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 1 source file to C:\test\bin
    [javac] C:\test\src\com\test\GenericMethodTest.java:15: type parameters of <X>X cannot be determined; no unique maximal instance exists for type variable X with upper bounds int,java.lang.Object
    [javac]         array[0] = method.getValue();
    [javac]                                   ^
    [javac] 1 error

发生了什么事?

Eclipse是否使用它自己的编译器?

谁有错误?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您发布的代码存在错误。 Eclipse让它滑动(因为你也用@SuppressWarnings(“未选中”)告诉它),但IDEA似乎并不那么宽容。你不能将值转换为X,因为擦除你不知道X在运行时是什么。

执行此操作的正确方法是生成类,然后将值存储为类型X.

public class GenericMethod<X> {
    private X value;

    public X getValue() {
        return value;
    }

    public void setValue(X value) {
        this.value = value;
    }
}

如果你不能这样做,那么不要试图在这里使用泛型,只是施放。当然,如果你真的非常热衷于使用泛型,你也可以这样做:

public <X> X getValue(Class<X> clazz) {
    return clazz.cast(value);
}

但是你必须上课。