Javaでマップ関数を使用する場合、次のことができます。
import com.example.MyClass;
someStream.map(MyClass::myStaticMethod)
しかし、私のプロジェクトでは静的インポートを使用することがあります。インポートが静的である場合、myStaticMethodを参照するにはどうすればよいですか?
私はこれがうまくいくと思いますが、そうではありません:
import static com.example.MyClass.myStaticMethod;
someStream.map(myStaticMethod); //does not compile
なぜこれが機能しないのですか?私は最初の例を使用することに「行き詰まっています」か、それとも他の解決策がありますか?.
Java言語仕様、 15.13。メソッド参照式 の関連部分を見てみましょう。
メソッド参照を作成する方法を以下に示します。
_MethodReference:
ExpressionName :: [TypeArguments] Identifier
ReferenceType :: [TypeArguments] Identifier
Primary :: [TypeArguments] Identifier
super :: [TypeArguments] Identifier
TypeName . super :: [TypeArguments] Identifier
ClassType :: [TypeArguments] new
ArrayType :: new
_
それらのすべてに_::
_トークンが含まれていることに注意してください。
someStream.map(myStaticMethod)
の引数には_::
_が含まれていないため、有効なメソッド参照ではありません。
これは、MyClass
をインポートする必要があることを示唆しています(おそらくさらにを静的インポートにインポートします)。 _MyClass::myStaticMethod
_としてのメソッド。
JLSがそう言っているので、それはコンパイルされません。しかし、それは単純なメソッド呼び出しであり、::
表記のみを使用して定義されるメソッド参照-ではないため、コンパイルすることさえできません。で使用される静的またはインスタンス。
それはまだ興味深い側面ですが、解決できない側面があります。現時点ではそうかもしれません。次のようなものを定義するための言語サポートはありません。
MethodRef <Class, Method> ref = ...
そして後でそれをあなたが望むように使ってください。しかし、それが可能だとは思いません。パラメータの型と戻り値の型も何らかの方法で定義する必要があるためです。これは、他の複数の場所と一致するかどうかを確認するために必要になるためです。 Predicate<String>
とFunction<String, Boolean>
のように、同じmethod reference
に適用される可能性があります。
メソッドを静的にインポートしても、メソッド参照を定義する方法には影響しません。
したがって、それを機能させたい場合は、静的インポートを導入する前とまったく同じように見えるはずです。
MyClass::myStaticMethod