我正在尝试做一些我通常不会做的事情,这有点奇怪,但我想让它工作。实质上,我有一个工厂必须通过调用具有不同类型数据的构造函数来创建对象(A和B在下面的代码中采用不同的类型)。我似乎已经得到了我的自我坚持走下去的泛型路线(我需要的代码是尽可能编译时间类型安全)。我不反对以不同的方式编写代码(如果可能,我想保留工厂的想法,而且我不想添加转换 - 因此“数据”参数不能是“对象”)。仿制药调用构造函数
有关如何使用泛型修复代码的任何想法或符合我的要求的替代方法?
(从技术上讲,这是家庭作业,但是我的教练尝试新的东西...所以它不是真正的功课:-)
public class Main2
{
public static void main(String[] args)
{
X<?> x;
x = XFactory.makeX(0, "Hello");
x.foo();
x = XFactory.makeX(1, Integer.valueOf(42));
x.foo();
}
}
class XFactory
{
public static <T> X<T> makeX(final int i,
final T data)
{
final X<T> x;
if(i == 0)
{
// compiler error: cannot find symbol constructor A(T)
x = new A(data);
}
else
{
// compiler error: cannot find symbol constructor B(T)
x = new B(data);
}
return (x);
}
}
interface X<T>
{
void foo();
}
class A
implements X<String>
{
A(final String s)
{
}
public void foo()
{
System.out.println("A.foo");
}
}
class B
implements X<Integer>
{
B(final Integer i)
{
}
public void foo()
{
System.out.println("B.foo");
}
}
我其实并不是一个玩具,但是它并不是超级批评,我倾向于这样做,或者将参数类型改为仅仅是一个String,实际上这个字符串来自argv,代表一个文件名或者一个JDBC连接字符串。 – TofuBeer 2009-11-06 15:31:09
好吧,我只是想与“我将如何实现这一点”,这基本上是什么出来。 – wds 2009-11-06 15:51:06