如何使用java模板实现此方法?

时间:2011-03-16 16:11:14

标签: java generics

创建一个界面(使用模板):

package util.filter;
public interface Filter<INPUT,OUTPUT> {
    public OUTPUT filter(INPUT mes);
}

和实现的类(仅用于测试):

package util.filter;
public static class TestImplFilter implements Filter<Integer,String>{
    public String filter(Integer i){
        return "Hello World!";
    }
}

我可以使用此代码进行测试:

Filter<Integer,String> f=new TestImplFilter();
System.out.println(f.filter(123));
//output: Hello World!

现在,我想创建一个静态方法,

使用impl类路径(util.filter.TestImplFilter)作为参数,

INPUT 作为第二个参数,并返回 OUTPUT

所以,我写下了代码:

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;
}
public final static Filter<?,?> getFilter(String path){
    return (Filter<?,?>)createInstance(path);
}

//my problem in here:
public final static OUTPUT filter(String path,INPUT mes){
    Filter<?,?> filter = (Filter<?, ?>) createInstance(path);
    return filter.filter(mes);
}

我在静态方法filter(String path,INPUT mes)中的问题,这段代码是错误的。

我该如何修复它并实现这个方法?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

我的错误,我捣乱了订单,现在它是正确的

您也可以为静态方法指定泛型。为此,请在返回参数之前添加gereric模板信息:

 public final static<INPUT,OUTPUT>  OUTPUT filter(String path,INPUT mes){

然后它将编译。

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);
        return filter.filter(mes);
    }
}