Προγραμματισμός

Γιατί δεν είναι δυνατή η νέα T () στην Java

Ορισμένες φορές οι άνθρωποι πιστεύουν ότι το «νέο T ()» θα ήταν εφικτό αν τα γενόσημα τροποποιήθηκαν. Αυτό δεν είναι αληθινό. Σκεφτείτε:

τάξη Foo {

T f = νέο T ();

}

Με τη διαγραφή, εφαρμόζετε το «νέο T ()» ως «νέο αντικείμενο ()», καθώς το αντικείμενο είναι το όριο του T. Με την επαναφορά, δημιουργείτε ένα αντικείμενο του οποίου η κλάση είναι η δυναμική δέσμευση για το Τ σε «αυτό». Είτε έτσι είτε αλλιώς, πρέπει να εκτελέσετε έναν κατασκευαστή no-args.

Όμως ο Foo δεν απαιτεί έναν τύπο που να είναι δεσμευμένος στο T (γνωστός ως α μάρτυρας του T) έχει έναν κατασκευαστή no-args. Το «νέο Foo ()» είναι απολύτως νόμιμο, αλλά ο Integer δεν έχει κατασκευαστή χωρίς-args, οπότε πώς η έκφραση αρχικοποίησης της παρουσίας υποτίθεται ότι ονομάζει «νέο T ()»; Δεν μπορεί να αποτελέσει μια προεπιλεγμένη τιμή για να περάσει στον κατασκευαστή του Integer.

Το «νέο T ()» δεν είναι ουσιαστικά αδύνατο στο πλαίσιο του ονομαστικός οριοθετήστε τον τύπο. (Ή, αν προτιμάτε, σε ένα πλαίσιο ξεχωριστής συλλογής, δεδομένου ότι μια παγκόσμια συλλογή θα μπορούσε να υπολογίσει ότι το «νέο T ()» είναι υγιές για όλες τις παρατηρήσεις του Foo.) Το C # 2.0 εισήγαγε ένα κατασκευαστικός τύπος δεσμευμένος που ονομάζεται ο νέος () περιορισμός για να επιτρέψει το «νέο T ()». Ωστόσο, είχαν ήδη ανάγκη για ενδιαφέροντες κανόνες σχετικά με τους τύπους που μπορούν να παρακολουθήσουν μια παράμετρο τύπου, και σε αυτό το πλαίσιο ο "δημόσιος περιορισμός χωρίς παραμέτρους" είναι απλός. Οι έννοιες C ++ προχωρούν περισσότερο επιτρέποντας μια δομική περιγραφή των τύπων που μπορούν να παρακολουθούν μια παράμετρο τύπου.

Η Java δεν πρόκειται να αποκτήσει όρια δομικού τύπου σύντομα. Τα ονομαστικά όρια τύπου της φόρμας C&I (τύπος διασταύρωσης) είναι αρκετά περίπλοκα. Κατά συνέπεια, ούτε η διαγραφή ούτε η επαναφορά μπορεί να υποστηρίξει το «νέο T ()».

Αυτή η ιστορία, "Γιατί το νέο T () δεν είναι δυνατό στην Java" δημοσιεύθηκε αρχικά από το JavaWorld.