Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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中的泛型_Java_Generics - Fatal编程技术网

Java中的泛型

Java中的泛型,java,generics,Java,Generics,我很难完全理解Java中的泛型。 我得到了最初的想法,但当涉及到更复杂的实现时,我不明白。 例如,在此代码中: public class TokenCounterMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text();

我很难完全理解Java中的泛型。 我得到了最初的想法,但当涉及到更复杂的实现时,我不明白。 例如,在此代码中:

public class TokenCounterMapper 
     extends Mapper<Object, Text, Text, IntWritable>{

   private final static IntWritable one = new IntWritable(1);
   private Text word = new Text();

   public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
     StringTokenizer itr = new StringTokenizer(value.toString());
     while (itr.hasMoreTokens()) {
       word.set(itr.nextToken());
       context.write(word, one);
     }
   }
 }
公共类令牌计数器映射器
扩展映射器{
私有最终静态IntWritable one=新的IntWritable(1);
私有文本字=新文本();
公共void映射(对象键、文本值、上下文上下文)引发IOException、InterruptedException{
StringTokenizer itr=新的StringTokenizer(value.toString());
而(itr.hasMoreTokens()){
set(itr.nextToken());
上下文。写(单词,一);
}
}
}
为什么我们有4个泛型参数(
)?
它们是什么意思?

这样您的
map()
方法就知道它将接收什么类型的参数。

这并没有什么非常复杂的,但我不喜欢这个示例,所以让我们使用另一个

假设我们想要创建一个可以容纳任何对象的数据结构。为此,我们有一个
List
的实现:

public interface List {
    boolean add(Object data);
}
这正是我想要的。嗯,有点

当我这样做时会发生什么?该怎么办

生成的代码都是好消息(不,它不应该编译):

publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
增加(10);
列表。添加(“20”);
列表。添加(30.0);
对于(int i=0;i
首先,我可以摆脱演员阵容,这是一开始的问题。因为我已经将整个列表绑定到了
整数
,所以我不必担心将其强制转换为
整数
。其次,在编译时,我的方法的错误对我来说是显而易见的——我正在将非整数的东西添加到我的列表中!这绝对是一个bug,而且修复起来非常快


泛型可以进一步复合,这就是为什么您经常看到泛型高达3或4个类型参数的原因。(如果你还有更多的问题,你真的应该质疑这个班是否做得太多。)他们的目的有两个:

  • 确保程序员不必进行不必要的强制转换来获取他们输入的数据

  • 确保在编译时尽早捕获将不正确数据插入数据类型或方法中的任何错误

根据我的经验,这实际上取决于类负责什么,以及泛型(及其边界)


作为一个更轻、更直观的示例,请探索API。这都是行键值三元组,其思想是有一些对象表示行值,有一些对象表示键值,还有一些对象实际上要存储在表中。

我也不理解这个示例。你从哪儿弄来的?是你写的吗?我在这里看不到泛型。这个例子是泛型的一个糟糕的例子,特别是如果你想更好地理解它们的话。最好从这里开始:注意,这似乎是Hadoop映射器的实现。这些是编译时指令,使其能够验证类型。在运行时,这些都被剥离了。你应该接受Makoto的答案;如果你不接受正确的答案,人们可能会停止回答你的问题。
public static void main(String[] args) {
    List list = new ArrayList();

    list.add(10);
    list.add("20");
    list.add(30.0);

    for(int i = 0; i < list.size(); i++) {
        int item = (int) list.get(i);
        System.out.println(item);
    }
}
public interface List<T> {
    boolean add(T data);
}
public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();

    list.add(10);
    list.add("20");
    list.add(30.0);

    for(int i = 0; i < list.size(); i++) {
        int item = (int) list.get(i);
        System.out.println(item);
    }

}