निम्नलिखित कोड नमूने में, बदसूरत सप्रेसवर्निंग एनोटेशन से बचने का एक तरीका है?
कोड परीक्षण अगर पैरामीटर टी का एक उदाहरण है ए और का एक और उदाहरण देता है ए यदि ऐसा है तो। के सामान्य अनुबंध को संतुष्ट करता है createCopy () अपने पैरामीटर के रूप में उसी प्रकार की एक वस्तु को वापस करने के लिए, इसलिए यह एक सुरक्षित संचालन है। वही परीक्षण के लिए जाता है बी.
मुझे इसके बारे में मालूम है वाइल्डकार्ड कैप्चर और हेल्पर तरीके लेकिन मुझे यकीन नहीं है कि क्या और कैसे इस स्थिति में मदद करता है, हालांकि समस्या काफी समान प्रतीत होती है।
abstract class Base {
public static <T extends Base> T createCopy(T t) {
if (t instanceof A) {
@SuppressWarnings("unchecked")
T copy = (T) new A((A) t);
return copy;
}
if (t instanceof B) {
@SuppressWarnings("unchecked")
T copy = (T) new B((B) t);
return copy;
}
throw new IllegalStateException();
}
}
class A extends Base {
public A() { }
public A(A a) { }
}
class B extends Base {
public B() { }
public B(B b) { }
}
उत्तर:
उत्तर № 1 के लिए 1आप कक्षा को विधि में पास कर सकते हैं, लेकिन यह अभी भी बदसूरत है:
abstract class Base {
public static <T extends Base> T createCopy(final T t,
final Class<T> klass) {
if (t instanceof A) {
final T copy = klass.cast(new A((A) t));
return copy;
}
if (t instanceof B) {
final T copy = klass.cast(new B((B) t));
return copy;
}
throw new IllegalStateException();
}
}
class A extends Base {
public A() {
}
public A(final A a) {
}
}
class B extends Base {
public B() {
}
public B(final B b) {
}
}
कॉलिंग t.getClass()
doesn "t या तो काम करता है। इसका कारण यह है कि T A या B का उपप्रकार हो सकता है (इसीलिए आप कोड वास्तव में टाइप-सुरक्षित नहीं हैं)।
संपादित करें : आपका कोड वास्तव में टाइप-सुरक्षित क्यों नहीं है: एक वर्ग की कल्पना करें AA
वह फैलता है A
। यदि आप अपने तरीके को इस वर्ग के उदाहरण के साथ कहते हैं, तो यह एक प्रकार की वस्तु का निर्माण करेगा A
और इसे डालने का प्रयास करें AA
.