मैं कुछ जावा कोड का अनुवाद करने की कोशिश कर रहा हूं जो वाइल्डकार्ड जेनेरिक का उपयोग सी # में करता है। मेरी समस्या यह है कि जावा एक वाइल्डकार्ड के साथ इस्तेमाल होने पर एक सामान्य प्रकार को कॉन्वर्सेंट और contravariant होने की अनुमति देता है।जावा बाउंड वाइल्डकार्ड (IInterf <?>) के लिए .NET समकक्ष?
जावा [यह एक पिछले question से स्पिन-ऑफ घिरा-वाइल्डकार्ड का एक सरल मामले से निपटने है] - काम करता है:
class Impl { }
interface IGeneric1<T extends Impl> {
void method1(IGeneric2<?> val);
T method1WithParam(T val);
}
interface IGeneric2<T extends Impl> {
void method2(IGeneric1<?> val);
}
abstract class Generic2<T extends Impl> implements IGeneric2<T> {
// !! field using wildcard
protected IGeneric1<?> elem;
public void method2(IGeneric1<?> val1) {
val1.method1(this);
//assignment from wildcard to wildcard
elem = val1;
}
}
abstract class Generic<T extends Impl> implements IGeneric1<T>, IGeneric2<T> {
public void method1(IGeneric2<?> val2) {
val2.method2(this);
}
}
# सी - संकलन नहीं है ...
class Impl { }
interface IGeneric1<T> where T:Impl {
//in Java:
//void method1(IGeneric2<?> val);
void method1<U>(IGeneric2<U> val) where U : Impl; //see this Q for 'why'
// https://stackoverflow.com/a/14277742/11545
T method1WithParam(T to);
}
interface IGeneric2<T>where T:Impl {
void method2<U>(IGeneric1<U> val) where U : Impl;
}
abstract class Generic2<T, TU>: IGeneric2<T> //added new type TU
where T : Impl
where TU : Impl
{
//in Java:
//protected IGeneric1<?> elem;
protected IGeneric1<TU> elem;
//in Java:
//public void method2(IGeneric1<?> val1)
public void method2<U>(IGeneric1<U> val)
where U : TU //using TU as constraint
{
elem = val; //Cannot convert source type 'IGeneric1<U>'
//to target type 'IGeneric1<TU>'
}
public abstract void method1WithParam(T to);
}
abstract class Generic<T> : IGeneric1<T>, IGeneric2<T> where T : Impl
{
//in Java:
//public void method1(IGeneric2<?> val2)
public void method1<U>(IGeneric2<U> val2) where U : Impl
{
val2.method2(this);
}
public abstract T method1WithParam(T to);
public abstract void method2<U>(IGeneric1<U> val) where U : Impl;
public abstract void nonGenericMethod();
}
यदि मैं interface IGeneric1<T>
सेबदलता हूंउपरोक्त त्रुटि दूर चला जाता है, लेकिन method1WithParam(T)
विचरण के बारे में शिकायत:
Parameter must be input-safe. Invalid variance: The type parameter 'T' must be
contravariantly valid on 'IGeneric1<out T>'.
मुझे जावा जेनिक्स बहुत कुछ नहीं पता है। लेकिन क्या जावा कोड टाइप-सुरक्षित है? – Euphoric
क्या आप कृपया प्रदान कर सकते हैं कि जावा कोड कैसा होगा या कहलाया जाना चाहिए? मुझे अभी भी समझना मुश्किल लगता है कि कोई ऐसा राक्षस क्यों बनायेगा। – Euphoric
ध्यान दें कि सादगी के लिए सी # की भिन्नता बाधा जानबूझकर अधिक प्रतिबंधक हैं। यह पूरी तरह से संभव है कि आप जावा कोड में व्यक्त कर रहे हैं, बस सी # में सीधा समकक्ष नहीं है। – millimoose