2015-11-03 53 views
1

我有一个变量取一类如如何从一个变量,泛型类型

Function<T, String> myFn; 

我想用它来获取类类型T

例如,如果我们有

Function<Integer, String> myFn; 

我需要得到Integer.class。

我知道,如果我们有

Integer x; 

我们可以使用Integer.class得到x.getClass()

编辑:我们能做到这一点,而无需使用反射?

编辑:一个更完整的例子

class MyFnClass<T> { 
    Function<T, String> myFn; 
    ... 
    public Class<T> getTypeClass() { 
     ??? 
    } 
} 

注意,它并没有使用myFn,但由于我们不能做T.class什么的,我还以为myFn是获得的唯一途径这个。在这种情况下不使用myFn的解决方案也是可以接受的。

+0

这个变量是一个泛型类型的字段吗?泛型函数中的'函数'与非泛型类型中的'函数<整数,字符串>'有很大区别。一个简短但完整的例子在这里真的很有帮助。 (你所要求的可能是可能的,但它可能不会......) –

+0

并且注意,如果'x'的值是非零值,那么只能从'x.getClass()'获得'Integer.class'。空值。 –

+0

@JonSkeet:我可以安全地假设实例变量是非空的 – user34812

回答

0
We can access the class from a variable like this: 

    myLocalVar = myClass.getMyVarVal(); 

Please refer this case as below : 

public class myClass<T> { 

    protected Class<T> clazz; 

    public myClass() { 
     this.clazz = (Class<>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    public Class<T> getClazz() { 
     return clazz; 
    } 
} 

public class Fetch extends myClass<C> { 
    /* ... */ 
    public void fetchClassFromVariable() { 
     //here we can call getClazz() to get the class from variable 
    } 
} 
+0

请详细说明您的答案。我不知道这些标识符代表什么。 – user34812

+0

你需要在这里评论之前先学习oops和java的基础知识。 – arjun9

1

Java使用type erasure这意味着在编译时删除与泛型有关的类型信息。

因此在运行时无法从Function<T, String>获得T型号。

中的代码片断,你有,你可以这样做:

public abstract class AbstractFunction<T> 
{ 
    private Function<T, String> function; 

    ... 

    public Class<T> getInputType() throws ClassNotFoundException 
    { 
    return (Class<T>)Class.forName(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0].getTypeName()); 
    } 
} 

public IntegerFunction extends AbstractFunction<Integer> 
{ 
} 

虽然都非常调皮,则恕我直言不必要的复杂性,并且可以简化为:

public abstract class AbstractFunction<T> 
{ 
    private Function<T, String> function; 

    ... 

    public abstract Class<T> getInputType(); 
} 

public IntegerFunction extends AbstractFunction<Integer> 
{ 
    @Override 
    public Class<Integer> getInputType() 
    { 
    return Integer.class; 
    } 
} 

这仍然引入了一个毫无意义的课程,可以进一步降低到:

public class MyFunction<T> 
{ 
    private Class<T> inputType; 
    private Function<T, String> function; 

    public MyFunction(Class<T> inputType, Function<T, String> function) 
    { 
    this.inputType = inputType; 
    this.function = function; 
    } 

    public Class<T> getInputType() 
    { 
    return inputType; 
    } 
} 

所有这一切说,需要知道泛型类型是一个code-smell位,并可能表明在你的设计中还有一些不太正确的东西。

+0

只有当你以某种方式获得类型为“T”的对象时,才可以执行'thatObj.getClass()'。它可能仍然是T或者匿名类的一个子类型,但是,除非用于'T'的类是最终的。 ('Integer'是final的。)把'T'声明为'T extends Number'或者什么是好的,至少知道T可以是什么的上界(类的范围)。 –

相关问题