web-dev-qa-db-ja.com

静的インポートでメソッド参照を使用するにはどうすればよいですか?

Javaでマップ関数を使用する場合、次のことができます。

import com.example.MyClass;

someStream.map(MyClass::myStaticMethod)

しかし、私のプロジェクトでは静的インポートを使用することがあります。インポートが静的である場合、myStaticMethodを参照するにはどうすればよいですか?

私はこれがうまくいくと思いますが、そうではありません:

import static com.example.MyClass.myStaticMethod;

someStream.map(myStaticMethod); //does not compile

なぜこれが機能しないのですか?私は最初の例を使用することに「行き詰まっています」か、それとも他の解決策がありますか?.

30
Xeli

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_としてのメソッド。

29
NPE

JLSがそう言っているので、それはコンパイルされません。しかし、それは単純なメソッド呼び出しであり、::表記のみを使用して定義されるメソッド参照-ではないため、コンパイルすることさえできません。で使用される静的またはインスタンス。

それはまだ興味深い側面ですが、解決できない側面があります。現時点ではそうかもしれません。次のようなものを定義するための言語サポートはありません。

MethodRef <Class, Method> ref = ...

そして後でそれをあなたが望むように使ってください。しかし、それが可能だとは思いません。パラメータの型と戻り値の型も何らかの方法で定義する必要があるためです。これは、他の複数の場所と一致するかどうかを確認するために必要になるためです。 Predicate<String>Function<String, Boolean>のように、同じmethod referenceに適用される可能性があります。

4
Eugene

メソッドを静的にインポートしても、メソッド参照を定義する方法には影響しません。

したがって、それを機能させたい場合は、静的インポートを導入する前とまったく同じように見えるはずです。

MyClass::myStaticMethod
3