2016-04-28 11 views
5

में अनावश्यक के रूप में चिह्नित लैम्बडास में कास्टिंग, मैं एक छोटे ढांचे को लिख रहा हूं जिसे 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); 
    } 
} 

और उत्पादन होता है:

enter image description here

enter image description here

:

Casted to A: IfaceA 
Casted to B: IfaceB 
Not Casted: Iface 
Declared as A: IfaceA 

लेकिन इंटेलीजे में मैं चेतावनी मिलती है

इसके अलावा javac परीक्षण किया है और मैं किसी भी चेतावनी नहीं मिलता:

% javac Main.java -Xlint                                           !2525 
+1

क्या आपने उस 'अधिक ...' लिंक पर क्लिक किया था? – Holger

+2

एफवाईआई, मेरे पास एक्लिप्स (मंगल 2) के साथ कोई चेतावनी नहीं है। – Tunaki

+0

@ होल्गर, बस "यह निरीक्षण अनावश्यक कास्ट एक्सप्रेशन रिपोर्ट करता है।" –

उत्तर

4

Intellij 2016/01/01 (145.597 के मार्च 29 वें के रूप में निर्माण) में कोई चेतावनी दिखाया गया है। आप शायद आइडिया के पुराने संस्करण का उपयोग कर रहे हैं और तब से यह मुद्दा तय किया गया था।

enter image description here

+0

धन्यवाद, मैं 143.1821.5 संस्करण और एंड्रॉइड स्टूडियो का उपयोग कर रहा था। मैंने IntelliJ का नवीनतम संस्करण डाउनलोड किया और यह काम करता है :) –