Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型:类型参数T隐藏类型T_Java_Generics - Fatal编程技术网

Java泛型:类型参数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

为什么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 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)