2011-07-18 14 views
0

この例では、asString()の呼び出しはコンパイルされません。 (別名:toString()を呼び出すとコンパイルできますが、カスタマイズする必要があります)メソッドが実際にすべてのTのために提供されているので、ジェネリック型のasStringまたは任意のメソッドを呼び出すにはどうすればよいですか?新しい方法の必要性を -Javaでジェネリック型のメソッドを呼び出す方法は?

class Range<T> 
{ 
    private T min; 
    private T max; 

    Range(T min, T max) 
    { 
     this.min = min; 
     this.max = max; 
    } 

    String makeString() 
    { 
     return "The range is from " + min.asString() + " to " + max.asString(); 
    } 
} 

答えて

4

を使用:

class Range<T extends AsStringable> 
{ 
    private T min; 
    private T max; 

    Range(T min, T max) 
    { 
     this.min = min; 
     this.max = max; 
    } 

    String makeString() 
    { 
     return "The range is from " + min.asString() + " to " + max.asString(); 
    } 
} 
0

実際には、あなたはあなたのクラスでそれをオーバーライドしないことでtoString()をカスタマイズすることができます。

あなたのコードについて:コンパイラはあなたが知っていること、つまりTには常に所定のメソッドがあることを知っている必要があります。現在のところ、のいずれかがObjectであることだけを伝えています。

interface AsStringable { 
    String asString(); 
} 

は、このようなあなたのクラスを定義します。それは、asString()を定義Fooのサブタイプに制限されている場合、あなたは、たとえば、asStringメソッドが定義されたインタフェースを提供する必要が<T extends Foo>

public interface Foo { 
    String asString(); 
} 

public class Range<T extends Foo> { .. } 
関連する問題