2012-03-21 9 views
7

機能の抽象化:のJavaのジェネリック:機能のような最大値()

public abstract class Function<X, Y> {  
     abstract Y apply(X x);  
    } 

maxメソッドの実装

public static <V extends Comparable<V>> Function<List<V>, V> max() { 

    return new Function<List<V>, V>() { 
     @Override 
     public V apply(List<V> list) { 
      return Collections.max(list); 
     } 
    }; 
} 

と使用(それがどのように見えるべきか)

Date result = max().apply(datesList); 

しかし、私このエラーが発生し、それがなぜ必要なのかわからないObject

incompatible types; inferred type argument(s) java.lang.Object do not conform to bounds of type variable(s) V 
found : <V>project.Function<java.util.List<V>,V> 
required: java.lang.Object 

私は同様のQAを大量に読み込んでいますが、これを修正する方法はありませんでした。おかげさまで

+1

Function<List<Date>, Date> fn = max(); Date result = fn.apply(dates); 

それとも、あなたは1行でそれを書きたいならば、あなたは次のことを行うことができ、あなたのmax()方法がExampleという名前のクラスで定義されていると仮定して:あなたはこれを試みることができますあなたの 'Function'型は、[interface](http://docs.oracle.com/javase/tutorial/java/concepts/interface.html)を使うのに適しています。 – Taymon

+0

私はTaymonに同意する、私は抽象クラスの代わりにインターフェイスを作るだろう。 [Google Guava](http://code.google.com/p/guava-libraries/)にはすでに「機能」インターフェースがあり、まったく同じものです。 – Jesper

+0

@Taymon提案をいただきありがとうございますが、実際にはこのクラスではもっと多くのメソッドがあります。例: public 関数(関数秒){...} –

答えて

13

Javaの型推論は非常に限定されています。あなたがこれを書いている場合:

Date result = max().apply(datesList); 

max()方法、Vの型パラメータを推測するのに十分な洗練されていませんので、代わりにjava.lang.Objectをとります。 FYI

Date result = Example.<Date>max().apply(dates); 
+0

ありがとう! –

+0

これは私のせいではなく、Javaの型推論の制限だと分かりました。ありがとう! –

関連する問題