• Java泛型Object和?区别


    在写spark streamming读取kafka latest offset的时候,有一下语句:
    Map<TopicAndPartition, Object> latestOffsets = JavaConversions.mapAsJavaMap(
            (scala.collection.Map<TopicAndPartition, Object>)kafkaCluster.getLatestLeaderOffsets(topicAndPartitionSet)
            .right()
            .get());
    编译报一下错误:
    不兼容的类型: scala.collection.immutable.Map<kafka.common.TopicAndPartition,org.apache.spark.streaming.kafka.KafkaCluster.LeaderOffset>无法转换为scala.collection.Map<kafka.common.TopicAndPartition,java.lang.Object>
     
    但是把Object换成?貌似就没问题。
    Map<TopicAndPartition, ?> latestOffsets = JavaConversions.mapAsJavaMap(
            (scala.collection.Map<TopicAndPartition, ?>)kafkaCluster.getLatestLeaderOffsets(topicAndPartitionSet)
            .right()
            .get());
     
    查了一下资料,个人感觉主要有一下两点需要注意。
    1,泛型是Object的类型其实这个Object就是指Object,不能考虑它是所有类的父类。
     
    List<String> ls = new ArrayList<String>(); // 1
    List<Object> lo = ls; //2
     
    上面语句2是不能通过编译,也就是说List<String>不是List<Object>的子类型。原因如下:假设语句2 通过编译,那么lo就可以put不是String类型的对象到集合中,那么在取出来的时候就可能出现各种千奇百怪的问题,所以Java编译器对于语句2报错。
     
    2,泛型是?类型其实表示类型是未知的,可以认为问号是泛型中所有类型的父类型。
    void printCollection(Collection<?> c) {
        for (Object e : c) {
            System.out.println(e);
        }
    }
    上面的printCollection可以传入任何类型的collection。
     
     
    小结:
    作为非Java语言出身,确实感觉有点基础不牢的感觉。也只能在碰到问题时一点一滴的积累了。
     
  • 相关阅读:
    UnityShaderVariant的一些探究心得
    NGUI在使用AssetBubble 出现材质丢失错误的情况
    [转] unity调试lua工具和方法
    各种文件的mime类型
    Javascript 随机数
    jQuery文字上下滚动
    Asp.Net Color转换
    Asp.Net 清除Html标签
    jQuery Ajax实例
    Asp.Net Cookie用法
  • 原文地址:https://www.cnblogs.com/superhedantou/p/5854555.html
Copyright © 2020-2023  润新知