【发布时间】:2011-02-25 22:35:47
【问题描述】:
我有以下工厂类。它有两个方法,它们接受 Class 实例并返回相应的对象。它们具有相同的方法名称,并且两个方法都以 Class 作为参数,但具有不同的泛型类,也返回不同的类型。编译器是否认为这两种方法是重复的?当我在 Eclipse 中打开 java 文件时,它会报告如下错误:
描述资源路径位置类型 方法lookupHome(Class) 与EJBHomeFactory EJBHomeFactory.java 类型中的另一个方法具有相同的擦除lookupHome(Class)
但是,javac 似乎不会报告任何错误。
import javax.ejb.EJBHome;
import javax.ejb.EJBLocalHome;
public class EJBHomeFactory {
public <T extends EJBHome> T lookupHome(Class<T> homeClass) throws PayrollException {
return lookupRemoteHome(homeClass);
}
public <T extends EJBLocalHome> T lookupHome(Class<T> homeClass) throws PayrollException {
return lookupLocalHome(homeClass);
}
/* ... define other methods ... */
}
更新 1:这是使代码通过的 ant 脚本,我不确定它是如何工作的,但它不会引发任何错误。编译器好像是Eclipse JDT Compiler,我用普通的javac试过了,编译不出来。
<target name="compile" depends="init" description="Compile Java classes">
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
<mkdir dir="${build.classes.dir}"/>
<javac destdir="${build.classes.dir}"
srcdir="${build.src.dir};${devsrc.dir}"
deprecation="${build.deprecation}"
debug="${build.debug}"
source="${build.source}"
target="${build.target}"
nowarn="${suppress.warning}"
bootclasspath="${bootclasspath}" >
<classpath>
<path refid="build.class.path.id"/>
</classpath>
</javac>
</target>
更新 2:我只是创建了另一个示例,有两个基类和两个子类,一个工厂类接受 Class 并根据参数的类型生成实例。该代码无法通过 javac 编译,并且在 Eclipse 中,IDE 抱怨同样的擦除问题。这是代码: 两个空基类:
public class BaseClassFirst {
}
public class BaseClassSecond {
}
两个子类:
public class SubClassFirst extends BaseClassFirst {
private int someValue = 0;
public SubClassFirst() {
System.out.println(getClass().getName());
}
public SubClassFirst(int someValue) {
this.someValue = someValue;
System.out.println(getClass().getName() + ": " + this.someValue);
}
}
public class SubClassSecond extends BaseClassSecond {
private int someValue = 0;
public SubClassSecond() {
System.out.println(getClass().getName());
}
public SubClassSecond(int someValue) {
this.someValue = someValue;
System.out.println(getClass().getName() + ": " + this.someValue);
}
}
因子类: 导入 java.lang.reflect.Method;
public class ClassFactory {
private static ClassFactory instance = null;
private ClassFactory() {
System.out.println("Welcome to ClassFactory!");
}
public static synchronized ClassFactory getInstance() {
if (instance == null) {
instance = new ClassFactory();
}
return instance;
}
public <T extends BaseClassFirst> T createClass(Class<T> firstClazz) {
if (firstClazz.equals(SubClassFirst.class)) {
try {
return firstClazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return null;
}
public <T extends BaseClassSecond> T createClass(Class<T> secondClazz) {
if (secondClazz.equals(SubClassSecond.class)) {
try {
return secondClazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return null;
}
public static void main(String[] args) {
ClassFactory factory = ClassFactory.getInstance();
SubClassFirst first = factory.createClass(SubClassFirst.class);
SubClassSecond second = factory.createClass(SubClassSecond.class);
for (Method method : ClassFactory.class.getDeclaredMethods()) {
System.out.println(method);
}
}
}
【问题讨论】:
标签: java generics overloading