13

特別なタイプでジェネリック メソッドを呼び出すことができることがわかりました。

一般的なメソッドがあるとします。

class ListUtils {
    public static <T> List<T> createList() {
        return new ArrayList<T>();
    }
}

次のように呼び出すことができます。

List<Integer> intList = ListUtils.<Integer>createList();

しかし、静的にインポートされた場合、どのように呼び出すことができますか? 例えば:

List<Integer> intList = <Integer>createList();

これは動作しません。

4

5 に答える 5

9

できません。クラス名を使用して参照する必要があります。

持っているようです:

void foo(List<String> a) {}

呼び出しfoo(createList())は正しいタイプを推測しません。したがって、次のようにクラス名を明示的に使用するかListUtils.createList()、中間変数を使用する必要があります。

List<String> fooList = createList();
foo(fooList);

最後に、グアバにはがLists.newArrayList()ありますので、それを再利用したほうがいいでしょう。

于 2010-11-04T10:21:49.423 に答える
2

以下は私のために働きます:

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();
    }
}
于 2010-11-04T10:22:50.817 に答える
2

できません。これは、Java 言語の構文の設計上の欠陥です。JVM 上の新しい静的型付け言語である Scala では、これが修正されています。(これは、Scala でその呼び出しを行う方法です: val intList: List[Int] = creatList[Int]())。

于 2010-11-04T13:33:43.887 に答える
1

Mindas は、これが推論で機能することをすでに実証していると思います。あなたの構文は少しずれています。ただし、Google Guava をご覧になることをお勧めします。Google Guava には、この正確な方法と、他にもいくつかの便利な方法があります。車輪を再発明する意味はありません:)

于 2010-11-04T11:48:10.427 に答える
0

私が読んだ限りでは、静的インポートメカニズムの欠点は、正式なパラメータを提供する場合は、呼び出し元のオブジェクト/クラスを指定する必要があることです。Mindasは正しいです。引数がない場合、型推論メカニズムは関数の戻り値が割り当てられている型を使用します。ただし、引数を提供するときにトリックが発生します。呼び出し元のオブジェクト/クラスを指定する必要がないようにしたい場合は、引数のキャストを介してヒントを入力できます。

public static <E> E foo(E e) {}

Number n = foo((Number)3);

型ヒントを使用すると、型推論は、そうでない場合の理由である整数ではなく、数値型のオブジェクトを返します。

于 2011-09-03T19:23:26.897 に答える