如何在java模板方法中检查类类型(instanceof)?

时间:2011-03-20 10:25:55

标签: java generics polymorphism

public class Test {
    private static Object createInstance(String classPath) {
        try {
            Class<?> tClass = Class.forName(classPath);
            if (tClass != null) {
                return tClass.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @SuppressWarnings("unchecked")
    public final static <INPUT, OUTPUT> Filter<INPUT, OUTPUT> getFilter(String path) {
        return (Filter<INPUT, OUTPUT>) createInstance(path);
    }

    public final static <INPUT, OUTPUT> OUTPUT filter(String path, INPUT mes) {
        Filter<INPUT, OUTPUT> filter = getFilter(path);

        //How to check the INPUT and OUTPUT type here?
        //if(INPUT instanceof String){ ... } not work

        return filter.filter(mes);
    }
}

请参阅我之前的问题here

感谢您的帮助:)

4 个答案:

答案 0 :(得分:4)

其他答案肯定是正确的。无论如何,我认为你做的事情很不寻常。 我会试着解释一下:

泛型用于静态多态性。泛型类型的实例在编译时确定。

像instanceof这样的构造用于在运行时检查对象的动态类型,因此如果您使用它们,则可以简单地避免使用泛型。 (您可以使用通用Object作为函数的参数,然后使用instanceof检查其类型) 例如:

public void method(Object o){
    if (o instanceof String){} //do what you want
    else ....
}

通常,如果您使用泛型,那么您只是试图避免使用该构造。通常,泛型类型可以实现一个众所周知的接口,其方式是可以对实现该接口的不同类型的对象执行对该对象执行的任何操作到过滤器方法,并且不知道所涉及的对象的特定类型。

我不知道你需要什么是多态特性,无论如何你也可以尝试这样的东西:

public interface polymorphicObj{
     public method();
}
public class Filter<GENERIC implements polymorphicObj>{

     public filter(GENERIC obj){
           obj.method();   //you don't need to know of which specific type is polymorphicObj
     }
}

答案 1 :(得分:1)

如果mes instanceof String应该有效。

答案 2 :(得分:1)

而不是检查INPUT,如何检查实际参数?

if(mes instanceof String) { 

答案 3 :(得分:1)

您将需要INPUT的实例:

class A<INPUT>{

    void typeOf(INPUT input){
        if(input.getClass() == "".getClass()){
            System.out.println("Input is String");
        }       
    }
}

所有对象扩展Object co他们有 getClass 方法。你可以用它来检查课程。