zoukankan      html  css  js  c++  java
  • 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语言出身,确实感觉有点基础不牢的感觉。也只能在碰到问题时一点一滴的积累了。
     
  • 相关阅读:
    使用Eclipse调试Java程序的10个技巧
    向mysql中插入格式为"yyyyMMdd HH:mm:ss"的时间
    乐观锁和悲观锁
    js验证表单大全
    subclipse版本回滚功能
    (转)Linux(RedHat AS4)下架设subversion(svn)服务器
    Redhat5下安装Apache2与Subversion1.6.15
    (转)深入探讨 Java 类加载器
    (转)Java深度历险(一)——Java字节代码的操纵
    关于SVN 目录结构
  • 原文地址:https://www.cnblogs.com/superhedantou/p/5854555.html
Copyright © 2011-2022 走看看