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