2011-04-01 54 views
0

我使用Factory模式來隱藏一些實例創建的複雜性。 我有這樣的:如何使用反射來建立通用的子類型?

class FooInt extends Foo<int>; 

我想做的事:

class<Foo<?>> fooType = FooInt.class; 

所有派生類型的Foo有一個構造函數取兩個參數。所以,我需要使用反射來創建子類型的實例:

Constructor<Foo<?>> ctor = fooType.getContructor(Blah.class, Blahblah.class); 
return ctor.newInstance(blah, blahblah); 

但javac的說:

"Type mismatch: cannot convert from Class<FooInt> to Class<Foo<?>>" 

我在做什麼錯?這樣可以使用反射嗎?

回答

2

嘗試:Class<? extends Foo<?>> fooType = FooInt.class;

另一點是:

  • 類類型是Classclass(大寫C);
  • 你不能使用泛型primities(使用整型而不是INT)

補充:這是它如何工作的:

public class Foo<T> { 

    private T value; 

    public Foo(T value) {  
     this.value = value; 
    }  
} 

public class FooInt extends Foo<Integer>{ 
    public FooInt(Integer value) { 
     super(value); 
    } 
} 

public class FooDouble extends Foo<Double>{ 
    public FooDouble(Double value) { 
     super(value); 
    } 
} 

工廠(至少只有一條線,但很多例外;-)):

import java.lang.reflect.InvocationTargetException; 

public class Factory { 

    <P, T extends Foo<P>> T build(Class<T> clazz, P param) 
      throws IllegalArgumentException, SecurityException, 
       InstantiationException, IllegalAccessException, 
       InvocationTargetException, NoSuchMethodException { 
     return clazz.getConstructor(param.getClass()).newInstance(param); 
    } 

    public static void main(String[] args) 
      throws IllegalArgumentException, SecurityException, 
       InstantiationException, IllegalAccessException, 
       InvocationTargetException, NoSuchMethodException { 

     Factory f = new Factory(); 

     System.out.println(f.build(FooInt.class, Integer.valueOf(1))); 
     System.out.println(f.build(FooDouble.class, Double.valueOf(1.1))); 
    } 
} 
+0

不,這導致「語法錯誤令牌‘延伸’......」 – retrodrone 2011-04-01 15:03:15

+0

@Gnat - 你是對的 – Ralph 2011-04-01 15:06:09

0

在java泛型只是在編譯時,沒有通用類型的信息在運行時保存。所以沒有辦法使用反射來處理java中的泛型。

1

我認爲拉爾夫是這個意思。我個人不覺得你應該投

Class<? extends Foo> fooType = FooInt.class; 
相關問題