在寫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);
}
for (Object e : c) {
System.out.println(e);
}
}
上面的printCollection可以傳入任何類型的collection。
小結:
作為非Java語言出身,確實感覺有點基礎不牢的感覺。也只能在碰到問題時一點一滴的積累了。