静的にインポートされているときに、タイプの一般的なメソッドを呼び出すにはどうすればよいですか?
-
28-09-2019 - |
質問
特別なタイプの一般的な方法を呼び出すことができることがわかりました。
一般的な方法があるとします:
class ListUtils {
public static <T> List<T> createList() {
return new ArrayList<T>();
}
}
私たちはそれを次のように呼ぶことができます:
List<Integer> intList = ListUtils.<Integer>createList();
しかし、静的にインポートされている場合、どのように呼び出すことができますか?例えば:
List<Integer> intList = <Integer>createList();
これは動作しません。
解決
できません。クラス名を使用して参照する必要があります。
持っているようです:
void foo(List<String> a) {}
と電話 foo(createList())
正しいタイプを推測しません。したがって、クラス名を明示的に使用する必要があります。 ListUtils.createList()
または、中間変数を使用します。
List<String> fooList = createList();
foo(fooList);
ついに、 グアバ もっている Lists.newArrayList()
, 、だからあなたはそれを再利用する方が良いでしょう。
他のヒント
私のための次の作品:
package test;
import java.util.List;
import static test.ListUtils.createList;
public class ListConsumer {
public static void main(String[] args) {
List<Integer> list = createList();
List<String> list2 = createList();
}
}
できません。これは、Java言語の構文の設計上の欠陥です。 JVMでより新しい静的に型付けられた言語であるScalaは、これを修正します。 (これはあなたがScalaでその呼び出しをする方法です: val intList: List[Int] = creatList[Int]()
).
Mindasは、これが推論で機能するはずであることをすでに実証していると信じています。あなたの構文は少し離れています。ただし、Google Guavaを見ることをお勧めします。この正確な方法と他のいくつかの便利な方法があります。ホイールを再発明する感覚はありません:)
私が読んだ限り、静的なインポートメカニズムの欠点は、正式なパラメーターを提供する場合は呼び出しオブジェクト/クラスを指定する必要があることです。 Mindasは正しいです。引数がない場合、タイプの推論メカニズムは、関数の戻り値が割り当てられているタイプを使用します。しかし、あなたが議論を提供しているときにトリックが起こります。通話オブジェクト/クラスを指定する必要がない場合は、引数のキャストを介してヒントを入力できます。
public static <E> E foo(E e) {}
Number n = foo((Number)3);
タイプのヒントを使用すると、型推論は、整数ではなくタイプ数のオブジェクトを返します。