में अनावश्यक के रूप में चिह्नित लैम्बडास में कास्टिंग, मैं एक छोटे ढांचे को लिख रहा हूं जिसे instanceof
का उपयोग करने की आवश्यकता है यह जानने के लिए कि किस प्रकार का कॉलबैक पारित किया जा रहा है। मुझे पहले से ही instanceof
के नुकसान पता है, लेकिन इसका उपयोग किसी तृतीय-पक्ष लाइब्रेरी में किया जाता है और मैं उस भाग को नहीं बदल सकता।इंटेलिजे
लैम्बडा लिखते समय, और उन्हें कास्टिंग करते समय, इंटेलिजे मुझे चेतावनी देता है कि कास्टिंग अनावश्यक है, लेकिन असल में इसकी आवश्यकता है (यह परिणाम को प्रभावित करता है), और यह काम करता है अगर मैं स्पष्ट रूप से लैम्ब्डा घोषित करता हूं। क्या आप जानते हैं कि यह एक बग है, शायद मुझे कुछ याद आ रहा है या ऐसा करने का एक बेहतर तरीका है?
उदाहरण:
public class Main {
public interface Iface {
String run();
}
public interface IfaceA extends Iface {
}
public interface IfaceB extends Iface {
}
public static void lambdaTest(Iface iface) {
System.out.print(iface.run()+": ");
if (iface instanceof IfaceA) {
System.out.println("IfaceA");
} else if (iface instanceof IfaceB) {
System.out.println("IfaceB");
} else {
System.out.println("Iface");
}
}
public static void main(String[] args) {
lambdaTest((IfaceA)() -> "Casted to A");
lambdaTest((IfaceB)() -> "Casted to B");
lambdaTest(() -> "Not Casted");
IfaceA lambda =() -> "Declared as A";
lambdaTest(lambda);
}
}
और उत्पादन होता है:
:Casted to A: IfaceA
Casted to B: IfaceB
Not Casted: Iface
Declared as A: IfaceA
लेकिन इंटेलीजे में मैं चेतावनी मिलती है
इसके अलावा javac परीक्षण किया है और मैं किसी भी चेतावनी नहीं मिलता:
% javac Main.java -Xlint !2525
क्या आपने उस 'अधिक ...' लिंक पर क्लिक किया था? – Holger
एफवाईआई, मेरे पास एक्लिप्स (मंगल 2) के साथ कोई चेतावनी नहीं है। – Tunaki
@ होल्गर, बस "यह निरीक्षण अनावश्यक कास्ट एक्सप्रेशन रिपोर्ट करता है।" –