我正在嘗試做一些我通常不會做的事情,這有點奇怪,但我想讓它工作。實質上,我有一個工廠必須通過調用具有不同類型數據的構造函數來創建對象(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