2011-04-01 55 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; 
相关问题