2013-06-30 101 views
3

我想寫一個方法,我需要創建一個臨時變量,總和,泛型類型T.但是,我收到錯誤「局部變量總和可能尚未初始化」。我怎樣才能初始化一個泛型變量?我無法將其設置爲0或0.0,並且我無法找到有關如何處理此問題的任何信息。下面是我的工作的一部分代碼:如何在Java中初始化一個通用變量?

public Matrix<T,A> multiply(Matrix<T,A> right) throws MatrixException 
{ 
    Matrix<T,A> temp = new Matrix<T,A>(arithmetics, rowSize, columnSize); 

    T sum, product; 

    if (rowSize != right.columnSize) 
     throw new MatrixException("Row size of first matrix must match column size " 
       + "of second matrix to multiply"); 

    setup(temp,rowSize,columnSize); 

    for (int i = 0; i < rowSize; i++){ 
     for (int j = 0; j < right.columnSize; j++) { 
      product = (arithmetics.multiply(matrix[i][j] , right.matrix[j][i])); 
      sum = arithmetics.add(product, sum); 
      temp.matrix[i][j] = sum; 
     } 
    } 
    return temp; 
} 

我不知道這是否會有助於澄清,但這裏是我的接口運算在:

public interface Arithmetics<T> { 

public T zero(); 
public T add(T a, T b); 
public T subtract(T a, T b); 
public T multiply (T a, T b); 
public T parseString(String str); 
public String toString(T a); 

} 

這裏是一個我的課,DoubleArithmetics,只是爲了顯示我是如何實現的接口:

public class DoubleArithmetics implements Arithmetics<Double> { 

protected Double value; 

public Double zero() 
{ 

    return new Double(0); 
} 

public Double add(Double a, Double b) 
{ 

    return new Double(a.doubleValue()+b.doubleValue()); 
} 

public Double subtract (Double a, Double b) 
{ 
    return new Double(a.doubleValue()-b.doubleValue()); 
} 

public Double multiply (Double a, Double b) 
{ 
    return new Double(a.doubleValue()*b.doubleValue()); 
} 

public Double parseString(String str) 
{ 
    return Double.parseDouble(str); 
} 

public String toString(Double a) 
{ 
    return a.toString(); 
} 
} 
+0

你嘗試初始化爲null? –

+0

如果上面的null對你不起作用,那麼如何創建一個靜態方法:'T sum = Arithmetics.initialize();'。您可以從該方法返回Double。 –

+0

@WandMaker,我能夠將它初始化爲null。我不知道我是如何忽略它的!謝謝。 – woollyMammoth

回答

3

只需使用zero方法,你已經在你的界面上進行初始化sum

T sum = arithmetics.zero(); 

對於非零初始化,你也可以添加充分利用longdouble值的方法,併爲他們返回T

public interface Arithmetics<T> { 

    public T zero(); 
    public T create(long l); 
    public T create(double d); 
    public T add(T a, T b); 
    public T subtract(T a, T b); 
    public T multiply (T a, T b); 
    public T parseString(String str); 
    public String toString(T a); 
} 

,然後實現它們:

public Double create(long l) { 
    return new Double(l); 
} 

public Double create(double d) { 
    return new Double(d); 
} 

最後,使用它們:

T one = arithmetics.create(1); 
+0

通過以這種方式使用方法(即,返回一個特定的類型而不是泛型類型),您正在擊敗泛型容器的整個目的。 create()方法應該返回類型T.算法的實現也應該有一個返回類型T的create()。 – stackoverflowuser2010

+1

@ stackoverflowuser2010你在說什麼?我的方法明確地返回'T',它們都是'public T create'。 – Brian

+0

接口的create()方法返回T.實現的方法也應該返回T.在你的代碼中,你的實現的create()方法返回Double。 – stackoverflowuser2010

0

由於類型擦除,在Java中實例化泛型有點棘手。我的方法是傳入您的泛型類的構造函數兩個項目:(1)特定於類型T的java.lang.reflect.Constructor;和(2)一個Object []數組,其中包含特定於類型T的缺省值。

當您稍後要實例化並初始化類型T時,需要調用Constructor.newInstance(Object [])。在下面的代碼中,MyGenericClass類代表您的泛型類(看起來像您的原始帖子中稱爲Matrix)。

我從InstantiationException for newInstance()解決方案,並Create instance of generic type in Java?

public class MyGenericClass<T> 
{ 
    Constructor _constructorForT; 
    Object[] _initialValueForT; 

    public MyGenericClass(Constructor constructorForT, 
          Object[] initialValueForT) 
    { 
     _constructorForT = constructorForT; 
     _initialValueForT = initialValueForT; 
    } 

    public void doSomething() 
    { 
     T sum = initializeT(_constructorForT, _initialValueForT); 

     System.out.printf("d = %f\n", sum); 
    } 

    @SuppressWarnings("unchecked") 
    private T initializeT(Constructor constructor, Object[] args) 
    { 
     T result = null; 

     try 
     { 
      result = (T) constructor.newInstance(args); 
     } 
     catch (java.lang.InstantiationException ex) 
     { 
     } 
     catch (java.lang.IllegalAccessException ex) 
     { 
     } 
     catch (java.lang.reflect.InvocationTargetException ex) 
     { 
     } 

     return result; 
    } 

    public static void main(String argv[]) throws Exception 
    { 
     Constructor constructor = 
      Double.class.getConstructor(new Class[]{double.class}); 

     Object[] initialValue = new Object[] { new Double(42.0) }; 

     MyGenericClass<Double> myGenericClass = 
      new MyGenericClass<Double>(constructor, initialValue); 

     myGenericClass.doSomething(); 

    } 
}