0

javaコンパイラが「変換」メソッドで「型パラメータTが型Tを隠している」と表示するのはなぜですか?

public static interface Translator<T, E> {
  E call(T t);
}

public static <T, E> List<E> translate(List<T> l, Translator<T, E> t) {
  ..
}

型パラメータ T を削除すると

public static <E> List<E> translate(List<T> l, Translator<T, E> t)

警告は消えましたが、今はできません

List<Long> l = new ArrayList<>();
List<String> r = translate(l, new Translator<Long, String>() { .. })

このエラーが発生する原因

The method translate(List<T>, GFn.Translator<T,E>) 
in the type GList is not applicable for the arguments 
(List<Long>, new GFn.Translator<Long,String>(){})
4

3 に答える 3

2

次のコードを使用していますが、警告メッセージは表示されません。

public class Main {

public static interface Translator<T, E> {
    E call(T t);
}

public static <T, E> List<E> translate(List<T> l, Translator<T, E> t) {
    List<E> result = new ArrayList<E>();
    for (T item: l) {
        result.add(t.call(item));
    }
    return result;
}

public static class TranslatorImpl implements Translator<Long, String> {

    @Override
    public String call(Long aLong) {
        return String.valueOf(aLong);
    }
}


public static void main(String[] args) throws IOException {
    List<Long> items = new ArrayList<Long>();
    items.add(10L);
    items.add(20L);
    items.add(30L);
    System.out.println(translate(items, new TranslatorImpl()));
}

}

于 2013-10-10T13:31:53.097 に答える
0

私はJDK 1.7を使用しましたが、次のコードは機能します:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

interface Translator<T, E>
{
    E call(T t);

}

class LongToStringTranslator implements Translator<Long, String>
{

    @Override
    public String call(Long t)
    {
        return t.toString();
    }

}

public class Main
{
    public static <T, E> List<E> translate(List<T> l, Translator<T, E> t)
    {
        List<E> e = new ArrayList<>();
        for (T item : l) {
            e.add(t.call(item));
        }
        return e;
    }

    public static void main(String[] args)
    {
        List<Long> l = Arrays.asList(1L, 2L);
        List<String> s = translate(l, new LongToStringTranslator());
        System.out.println(s);
    }
}
于 2013-10-10T13:37:35.023 に答える
0

申し訳ありませんが、私の間違いでした。問題は、その関数の後の関数にあり、それが間違っていました:

public static void walk(Iterable<T> list, Walker<T> walker)

私がそれを修正した場合、これにはTタイプのパラメータがありません

public static <T> void walk(Iterable<T> list, Walker<T> walker)

私のクラスの他のすべてのメソッドでは、すべての警告が消えます。

ありがとう、そしてごめんなさい。

于 2013-10-10T13:50:58.023 に答える