2015-01-14 21 views
2

我試圖做一個函數,將調用給定一組參數的類的構造函數 package testytest;數字對象自動轉換爲其原生

import java.lang.reflect.Constructor; 

public class MainClass { 

    public static <T> T newClass(Class<?> inst, Object ... args){ 
     @SuppressWarnings("unchecked") 
     Constructor<?> [] ctor = (inst.getDeclaredConstructors()); 
     int argIndex = 0; 
     ctorLoop: for(Constructor<?> x : ctor){ 
      argIndex = 0; 
      for(Class<?> s : x.getParameterTypes()){ 
       if(argIndex > args.length || args[argIndex++].getClass() != s){ 
        if(argIndex <= args.length) 
        System.out.println("Param doesnt match : " + args[argIndex-1].getClass() + " with " + s); 
        continue ctorLoop; 
       } 
      } 
      try{ 
       return (T)x.newInstance(args); 
      }catch(Exception e){ 
       System.err.println("Error in instantiating instance of class : " + inst); 
       return null; 
      } 
     } 
     System.err.println("No instance of constructor found for class " + inst); 
     return null; 
    } 

    public static void main(String[] args) { 
     System.out.println(newClass(Double.class,5.0)); 

    } 

} 

它給我的錯誤

Param doesnt match : class java.lang.Double with double 
Param doesnt match : class java.lang.Double with class java.lang.String 
No instance of constructor found for class class java.lang.Double 

看行

Param doesnt match : class java.lang.Double with double 

是有辦法本身使這個布爾匹配不區分交換每本機類型(雙,浮法,long,int等?)

回答

2

在包裝類中定義了常量,它們表示Class原始類型的對象。對於double,請使用Double.TYPE

Class實例代表原始類型double

這應該與您正在查找的構造函數的推測double參數相匹配。

用於其它基元的其它實例是Integer.TYPEFloat.TYPEShort.TYPEByte.TYPELong.TYPECharacter.TYPE,並Boolean.TYPEvoid甚至有Void.TYPE

1

不,沒有。參考類型java.lang.Double和原始類型double都有對應的Class對象。沒有辦法從一個Class對象到另一個(裝箱/拆箱)。

你必須保留自己的(雙)地圖。

0

執行此操作的簡單方法是使用java.beans.Statement。它會自動處理所有這些轉換。