Java泛型:类型参数T隐藏类型T
为什么java编译器在“translate”方法中给我“类型参数T隐藏类型T”Java泛型:类型参数T隐藏类型T,java,generics,Java,Generics,为什么java编译器在“translate”方法中给我“类型参数T隐藏类型T” 公共静态接口转换器{ E呼叫(T); } 公共静态列表翻译(列表l,转换器t){ .. } 如果我删除类型参数T public static <E> List<E> translate(List<T> l, Translator<T, E> t) 公共静态列表翻译(列表l,转换器t) 警告消失了,但现在我无能为力 List<Long> l = new
公共静态接口转换器{
E呼叫(T);
}
公共静态列表翻译(列表l,转换器t){
..
}
如果我删除类型参数T
public static <E> List<E> translate(List<T> l, Translator<T, E> t)
公共静态列表翻译(列表l,转换器t)
警告消失了,但现在我无能为力
List<Long> l = new ArrayList<>();
List<String> r = translate(l, new Translator<Long, String>() { .. })
listl=newarraylist();
列表r=translate(l,新转换器(){..})
因为它给了我这个错误
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>(){})
方法翻译(列表,GFn.Translator)
在类型中,GList不适用于参数
(列表,新的GFn.Translator(){})
我正在使用以下代码,没有收到任何警告消息:
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()));
}
公共类主{
公共静态接口转换器{
E呼叫(T);
}
公共静态列表翻译(列表l,转换器t){
列表结果=新建ArrayList();
对于(T项:l){
结果.添加(t.调用(项目));
}
返回结果;
}
公共静态类TranslatorImpl实现Translator{
@凌驾
公共字符串调用(长时间){
返回字符串.valueOf(沿);
}
}
公共静态void main(字符串[]args)引发IOException{
列表项=新建ArrayList();
项目。添加(10L);
项目。添加(20L);
项目。添加(30L);
System.out.println(translate(items,newtranslaterImpl());
}
}我使用了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);
}
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
接口转换器
{
E呼叫(T);
}
类LongToStringTranslator实现转换器
{
@凌驾
公共字符串调用(长t)
{
返回t.toString();
}
}
公共班机
{
公共静态列表翻译(列表l,转换器t)
{
列表e=新的ArrayList();
对于(T项:l){
e、 增加(t.呼叫(项目));
}
返回e;
}
公共静态void main(字符串[]args)
{
列表l=Arrays.asList(1L,2L);
列表s=转换(l,新的LongToStringTranslator());
系统输出打印项次;
}
}
很抱歉,这是我的一个错误,问题出在一个错误的函数之后:
public static void walk(Iterable<T> list, Walker<T> walker)
publicstaticvoidwalk(可编辑列表,Walker)
如果我纠正的话,这个mas缺少T类型参数
public static <T> void walk(Iterable<T> list, Walker<T> walker)
publicstaticvoidwalk(可编辑列表,Walker)
所有警告在我的类中的所有其他方法中消失
谢谢大家,很抱歉。函数translate是在接口之外定义的吗?您是否在任何地方有一个名为
T
的具体类/实体?@Nessuno,应该是这样,因为接口在java 8之前不能有方法体,java 8尚未发布。静态界面在我看来很笨拙。@svz你当然是对的。我在考虑一个抽象类…我使用匿名实现进行了检查,但仍然没有警告
public static <T> void walk(Iterable<T> list, Walker<T> walker)