我有以下代码:
SomeInterface self = sessionContext.getBusinessObject(sessionContext.getInvokedBusinessInterface());下面的方法签名(来自eclipse工具提示(不是真正的代码)):
<Object> Object javax.ejb.SessionContext.getBusinessObject(Class<Object> arg0) throws IllegalStateException由于某种原因,返回类型被解析为对象。这是很奇怪的,因为eclipse没有将这一行标记为错误,但是ant和maven构建器在这一行上失败,表示不能将对象转换为SomeInterface。
我有几个问题:
SomeInterface)?下面的示例在eclipse下正确编译,但在maven中失败:
public class TestClass implements SomeInterface {
private Resolver resolver;
/**
*
*/
@SuppressWarnings("unchecked")
public TestClass() {
SomeInterface c = resolver.some(resolver.someClass());
}
@Override
public void something() {
}
}
class Resolver {
public <T> T some(final Class<T> c) {
return null;
}
public Class someClass() {
return null;
}
}
interface SomeInterface {
void something();
}这里正确地推断了类型(来自eclipse工具提示(不是真正的代码)):
<SomeInterface> SomeInterface Resolver.some(Class<SomeInterface> c)但是这个类仍然不能用maven编译器编译。
我用的是月食朱诺。
UPD
Maven失败:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project jpharm-server: Compilation failure
[ERROR] TestClass.java:[21,39] incompatible types
[ERROR] found : java.lang.Object
[ERROR] required: SomeInterface发布于 2013-01-27 23:11:46
你可以写:
SomeInterface c = resolver.<SomeInterface> some(resolver.someClass());来帮助编译器。
您给出的具体示例不应该编译。当应用类型推断时,编译器试图找到最适合该语句所有操作数的特定类型。在这里,resolver.someClass()返回一个可以是任何类的Class,即它实际上是一个Class<? extends Object>,无法推断? extends Object是一个SomeInterface。
例如,someClass很可能是:
public Class someClass() {
return Object.class;
}发布于 2013-01-27 23:24:58
问题是这条线:
public Class someClass() {这将返回一个原始类型的Class对象,它实际上等同于一个Class<? extends Object>。您还应该使此方法成为通用方法:
public Class<? extends T> someClass() {用以下方式称呼它:
resolver.<SomeInterface>someClass();理想情况下,您应该在getInvokedBusinessInterface()的签名中填写一个实际类型,以便它返回一个Class<? extends SomeInterface>。
https://stackoverflow.com/questions/14553397
复制相似问题