जेनेरिक प्रकार के मापदंडों को लागू करने के लिए जावा के नियम को नेविगेट करने में मुझे कुछ परेशानी हो रही है। निम्नलिखित वर्ग पर विचार करें, जिसमें एक वैकल्पिक सूची पैरामीटर है:
import java.util.Collections;
import java.util.List;
public class Person {
private String name;
private List<String> nicknames;
public Person(String name) {
this(name,Collections.emptyList());
}
public Person(String name,List<String> nicknames) {
this.name = name;
this.nicknames = nicknames;
}
}
मेरा जावा कंपाइलर निम्नलिखित त्रुटि देता है:
Person.java:9: The constructor Person(String, List<Object>) is undefined
लेकिन Collections.emptyList()
रिटर्न प्रकार <T> List<T>
, नहीं List<Object>
। कलाकारों को जोड़ने से कोई फायदा नहीं होता
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
पैदावार
Person.java:9: inconvertible types
के EMPTY_LIST
बजाय का उपयोग करemptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
पैदावार
Person.java:9: warning: [unchecked] unchecked conversion
जबकि निम्नलिखित परिवर्तन से त्रुटि दूर हो जाती है:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
क्या कोई समझा सकता है कि मैं यहाँ किस प्रकार का जाँच नियम बना रहा हूँ, और इसके आसपास काम करने का सबसे अच्छा तरीका है? इस उदाहरण में, अंतिम कोड का उदाहरण संतोषजनक है, लेकिन बड़ी कक्षाओं के साथ, मैं इस "वैकल्पिक पैरामीटर" पैटर्न के बिना कोड को दोहराए बिना तरीकों को लिखने में सक्षम होना चाहता हूं।
अतिरिक्त क्रेडिट के लिए: EMPTY_LIST
इसका विरोध करना कब उचित है emptyList()
?