2011-03-16 41 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

相關問題