2017-07-15 60 views
1

我是新來的泛型類型,並想知道如何正確地實現泛型類中的泛型接口,所以類型的確定將被延遲到當我實例化對象時這個泛型類。在泛型類中實現通用接口

我的代碼如下:

package org.processor.interfaces; 

import org.filter.interfaces.IFile; 

public interface ProcessorResult<T> { 

public IFile getFile(); 
public String getProcessorName(); 
public Class<? extends Processor<T>> getProcessorClass(); 
public T getResult(); 
} 

而且類,它實現該接口:

package org.processor.interfaces.impl; 
import org.filter.interfaces.IFile; 
import org.processor.interfaces.Processor; 
import org.processor.interfaces.ProcessorResult; 

public class ProcessorResultImpl<T> implements ProcessorResult<T> { 

private T result; 
private String processorName; 
private IFile file; 

public ProcessorResultImpl(T result) { 
    this.t = result; 
} 

@Override 
public IFile getFile() { 
    return file; 
} 

@Override 
public String getProcessorName() { 
    return processorName; 
} 

@Override 
public Class<? extends Processor<T>> getProcessorClass() { 
    return null; 
} 

@Override 
public T getResult() { 
    return t; 
} 
} 

時,我想實例化這個類的對象的時刻是在方法返回ProcessorResult作爲(這僅僅是爲了示範):

import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import org.filter.interfaces.IFile; 
import org.processor.interfaces.Processor; 
import org.processor.interfaces.ProcessorFilter; 
import org.processor.interfaces.ProcessorResult; 

public class ProcessorLineCountImpl<T> implements Processor<T> { 

    private ProcessorFilter<T> processorFilter; 
    private String name; 

    public ProcessorLineCountImpl() { 

    } 

    public ProcessorResult<T> process(IFile file) { 
    int count = 0; 
    try (Scanner sc = new Scanner(file.openInputStream())) { 
     while (sc.hasNext()) { 
     String word = sc.next(); 
     if (word.indexOf("\\") == -1) { 
      count++; 
     } 
     } 
    return null; 
} 
return null; 

@Override 
public String getName() { 
    return name; 
} 

@Override 
public void setFilter(ProcessorFilter<T> filter) { 
    this.processorFilter = filter; 
} 

在th在情況下,我得到語法錯誤

Type mismatch: cannot convert from ProcessorResultImpl<Long> to 
ProcessorResult<T> 

問題:

  1. 它是如何能夠正確地完成爲我出出主意,但沒有找到對任何解決方案網頁。
  2. 延遲確定類型直到實例化對象是否是一種很好的方法?

感謝您的任何建議。

+0

這並未完全沒有意義 - 如果它是* generic *,那麼你爲什麼要硬編碼一個'Long'? –

+0

這個'process'方法在哪裏定義? –

+0

'process'需要返回'ProcessorResult ' – 4castle

回答

0

我不知道這個process方法是從哪裏來的,因爲您沒有將它包含在您列出的任何類中。但是,因爲此方法將根據其中一個參數簡單地創建並返回一個新類,所以最好使用實用程序方法,該方法不需要重寫該方法。此外,file參數甚至沒有使用,所以它可以被刪除:

public static ProcessorResult<T> process(T result) { 
    return new ProcessorResultImpl<T>(result); 
} 

的方法,現在可以以下面的方式從產生等效輸出被調用之前:

public class ... implements ...<Long> { 

    public static void main(String... args) { 
     Somewhere.process(10L); 
    } 

} 
+0

用process()方法中的類編輯我的文章(上面)時,我的主要目標是返回ProcessResult ,其中T類型將是Long或Integer,具體取決於它是小文件還是大文件。 – user8071107

+0

@ user8071107如果是這樣的話,那麼如果你只打算返回一個'Integer'或'Long',就不需要使用'T'。只需在運行時使用'Number'並返回'Integer'或'Long',因爲它們都擴展了'Number',並且不需要顯式的類型轉換。 –

+0

我可能會這樣做,如果它不是要求之一。有沒有辦法保持這個ProcessorResult 並以某種方式返回它已經定義的類型? – user8071107