2013-10-10 3 views
0

Почему java-компилятор дает мне «параметр типа T скрывает тип T» в методе «перевод»?Java generics: параметр типа 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>(){}) 
+0

Является ли функция переводить определенную вне интерфейса? – Nessuno

+0

У вас есть конкретный класс/сущность в любом месте с именем 'T'? – berry120

+0

@Nessuno, это должно быть, поскольку интерфейсы не могут иметь тела метода до java 8, который еще не выпущен. И статический интерфейс выглядит неудобно для меня. – svz

ответ

2

I используя следующий код и сделайте не получает никаких предупреждений:

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())); 
} 

}

+0

Я проверил с анонимной реализацией и все еще никаких предупреждений –

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); 
    } 
} 
0

Извините, но была ошибка моя, проблема была в после чего произошла ошибка:

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

Этот маска не имеет параметра типа T, если я его исправлю

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

Все предупреждения исчезают во всех других методах моего класса.

Спасибо и простите всем.

Смежные вопросы