假设有一个通用的Query类,它执行db查询并返回映射的对象。
Public class Query
{
public <T> T getObject(Class<T> type){
{
// get the data and build object using reflection
return T;
}
}
现在在代码的某个地方,消费&#34;查询&#34;如下所示:
Query q = new Query();
T result = q.<Person>getObject(person.getClass());
这在eclipse环境中编译并运行良好。但在ANT / Gradle构建中失败了。在ANT / Gradle编译期间,java编译器只是忽略泛型类型&lt; T&gt;。在调用方法时传递。并将运行时类型作为参数传递的基线,其中&#34; Class&#34;不是&#34;等级&lt; T&gt;&#34;。并抛出不兼容的类型错误:
[javac] Query.java:18:错误:不兼容的类型
[javac] T result = q。的getObject(person.gerClass());
[javac] ^
[javac]要求:T
[javac]发现:对象
[javac]其中T是一个类型变量:
[javac] T扩展在类Query
中声明的Object
但是,如果我转换参数或结果,它会在ANT / Gradle中编译而不会出现任何问题。如下所示。
T result = q.<Person>getObject((Class<T>)person.getClass());
或
T result = (T) q.<Person>getObject(person.getClass());
我很想知道为什么在eclipse环境中编译好的代码在ANT / Gradle构建中失败了?是否有任何环境或编译时参数强制执行泛型类型检查?