โดยทั่วไปแล้วการดาวน์สตรีมคือสิ่งที่คุณทำเมื่อความรู้ที่รู้จักกันในแบบคงที่คอมไพเลอร์มีประเภทของสิ่งที่เฉพาะเจาะจงน้อยกว่าสิ่งที่คุณรู้ (หรืออย่างน้อยก็หวัง)
ในสถานการณ์เช่นตัวอย่างของวัตถุที่ถูกสร้างขึ้นในฐานะที่เป็นApple
แล้วว่ามีความรู้ที่ถูกโยนออกไปโดยการจัดเก็บ refernce Fruit
ในตัวแปรของชนิด จากนั้นคุณต้องการใช้การอ้างอิงแบบเดียวกันApple
อีกครั้ง
เนื่องจากข้อมูลที่ถูกโยนออกไปเท่านั้น "ในประเทศ" แน่ใจว่าคอมไพเลอร์จะสามารถรักษาความรู้ที่parent
เป็นจริงแม้ว่าประเภทประกาศของมันคือApple
Fruit
แต่มักจะไม่มีใครทำอย่างนั้น ถ้าคุณต้องการสร้างApple
และใช้มันเป็นApple
คุณเก็บไว้ในApple
ตัวแปรไม่ใช่Fruit
อย่างใดอย่างหนึ่ง
เมื่อคุณมีFruit
และต้องการที่จะใช้เป็นApple
ก็มักจะหมายความว่าคุณได้รับFruit
ผ่านบางหมายความว่าโดยทั่วไปจะกลับชนิดของใด ๆแต่ในกรณีนี้คุณจะรู้ว่ามันเป็นFruit
Apple
เกือบทุกครั้งที่คุณไม่ได้สร้างมันขึ้นมาคุณก็ผ่านมันไปได้ด้วยรหัสอื่น
ตัวอย่างที่ชัดเจนคือถ้าฉันมีparseFruit
ฟังก์ชั่นที่สามารถเปลี่ยนสตริงเช่น "แอปเปิ้ล", "ส้ม", "มะนาว" ฯลฯ ลงในคลาสย่อยที่เหมาะสม; โดยทั่วไปสิ่งที่เรา (และคอมไพเลอร์) สามารถรู้เกี่ยวกับฟังก์ชั่นนี้ก็คือมันจะส่งกลับบางชนิดFruit
แต่ถ้าฉันโทรparseFruit("apple")
แล้วฉันรู้ว่ามันจะเรียกApple
และอาจต้องการที่จะใช้Apple
วิธีการดังนั้นฉันสามารถ downcast
คอมไพเลอร์สมาร์ทอย่างเพียงพออีกครั้งสามารถหาคำตอบได้ที่นี่โดยการฝังซอร์สโค้ดสำหรับparseFruit
เพราะฉันเรียกมันว่าค่าคงที่ (ยกเว้นว่าจะอยู่ในโมดูลอื่นและเรามีการคอมไพล์แยกต่างหากเช่นใน Java) แต่คุณควรจะสามารถดูว่าตัวอย่างที่ซับซ้อนมากขึ้นเกี่ยวกับข้อมูลแบบไดนามิกอาจกลายเป็นเรื่องยากมากขึ้น (หรือเป็นไปไม่ได้!) เพื่อให้คอมไพเลอร์ตรวจสอบ
โดยปกติแล้วการดาวน์สตรีมของโค้ดนั้นเกิดขึ้นเมื่อคอมไพเลอร์ไม่สามารถตรวจสอบว่าดาวน์สตรีมนั้นปลอดภัยโดยใช้วิธีการทั่วไปและไม่ใช่ในกรณีง่ายๆเช่นทันทีหลังจากการอัพแคสต์ทิ้งข้อมูลประเภทเดียวกันกับที่เราพยายามกู้คืน