试图在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是否使用它自己的编译器?
谁有错误?
答案 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);
}
但是你必须上课。