如何检查泛型方法中的泛型类型

时间:2015-09-24 07:31:05

标签: java generics

我在Java中需要这样的东西(C#样本)

 class Program
    {
        static void Main(string[] args)
        {
            Method<String>();
        }

        static void Method<T>()
        {
            Type typeT = typeof(T);
            Type typeString = typeof(String);
            if (typeT == typeString)
            {
                Console.WriteLine("Is String");
            }
        }
    }
}

我有通用方法,需要在方法中检查类型T.

protected <T> MyClass<T> myMethod(MyClass<T> myObj){
   // if  T is string do ..., else do ... 
}

2 个答案:

答案 0 :(得分:3)

您需要一个Class<T>类型的附加参数,因为在类型擦除后,通用信息将被删除。但是,拥有Class<T>将允许您在运行时访问有关T的(meta)信息:

protected <T> MyClass<T> myMethod(MyClass<T> myObj, Class<T> clazz) {
   if (clazz == String.class) { ... } 
}

答案 1 :(得分:1)

您无法执行typeof(T);,因为T在运行时未定义/未知。

  

在Java中,Generics不会存在于运行时,它适用于名为擦除的概念。

Docs:在类型擦除过程中,Java编译器会擦除所有类型参数,如果type参数是有界的,则将每个参数替换为第一个绑定,如果type参数是无界的,则替换为Object。

您可以使用参数

上的instanceof运算符来解决此问题

即。 myObj instanceof String

或@kocko建议的答案