इंटरफेस में परिभाषित इंटरफ़ेस प्रभावी जावा जेनेरिक अध्याय पर विचार करें।इस अनचेक चेतावनी को दबाने के लिए सुरक्षित क्यों है?
public interface UnaryFunction<T> {
T apply(T arg);
}
और UnaryFunction
// Generic singleton factory pattern
private static UnaryFunction<Object> IDENTITY_FUNCTION = new UnaryFunction<Object>() {
public Object apply(Object arg) { return arg; }
};
// IDENTITY_FUNCTION is stateless and its type parameter is
// unbounded so it's safe to share one instance across all types.
@SuppressWarnings("unchecked")
public static <T> UnaryFunction<T> identityFunction() {
return (UnaryFunction<T>) IDENTITY_FUNCTION;
}
लौटने क्यों है (UnaryFunction<T>)
को IDENTITY_FUNCTION
के कलाकारों सुरक्षित के लिए निम्न कोड?
पुस्तक यह सवाल पूछती है कि मैं पूछ रहा हूं लेकिन मैं यहां तर्क का पालन नहीं कर सकता। हम apply
फ़ंक्शन का आविष्कार कर रहे हैं जो पहचान ऑपरेशन करता है? मैं उलझन में हूं क्योंकि यह वह कार्य है जो किसी भी वस्तु को संशोधित किए बिना उसी वस्तु को पार करता है।
(UnaryFunction<T>)
को IDENTITY_FUNCTION के कलाकारों, एक अनियंत्रित डाली चेतावनी उत्पन्न करता है के रूप मेंUnaryFunction<Object>
हरT
के लिए एकUnaryFunction<T>
नहीं है। लेकिन पहचान फ़ंक्शन विशेष है: इसके तर्क को अनमोडिफाइड देता है, इसलिए हम जानते हैं कि यह का उपयोगUnaryFunction<T>
के रूप मेंT
के मान के रूप में करने के लिए टाइपएफ़ है। इसलिए, हम आत्मविश्वास से अनचेक किए गए कास्ट चेतावनी को दबा सकते हैं जो द्वारा इस कलाकार द्वारा उत्पन्न किया गया है। एक बार ऐसा करने के बाद, कोड त्रुटि के बिना संकलित करता है या चेतावनी।
साइड प्रश्न: क्या आप पुस्तक का उपयोग कर रहे हैं, और यह कहना है कि इस कोड की बात है? – asteri
@Jeff प्रभावी जावा पुस्तक का नाम है और यह जेनरिक अध्याय में है, खंड है कि जेनेरिक कार्यों का वर्णन करता है में विशेष रूप से। – Geek