2011-03-16 69 views
0

创建一个接口(使用模板):我该如何使用java模板实现这个方法?

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)问题,这个代码是错误。

我该如何解决这个问题并实现这个方法?

感谢帮助:)

+0

当您将“此代码为错误”替换为实际错误时,更容易提供帮助。 – 2011-03-16 16:16:25

+0

@Kirk Woll这是一个简单的编译器错误:INPUT和OUTPUT无法解析为类型。 – Ralph 2011-03-16 16:20:01

回答

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); 
    } 
} 
+0

非常感谢,很酷! :) – Koerr 2011-03-16 16:44:07

+0

嗨@拉尔夫,我有其他问题,请帮助我,谢谢! http://stackoverflow.com/questions/5367890/how-to-check-the-class-typeinstanceof-in-java-templet-method – Koerr 2011-03-20 10:28:43

相关问题