আমি নীচে একটি টেম্পলেট ক্লাস পেয়েছি:
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
আমি কীভাবে আমার ক্লাসে টি এর নতুন উদাহরণ তৈরি করব?
আমি নীচে একটি টেম্পলেট ক্লাস পেয়েছি:
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
আমি কীভাবে আমার ক্লাসে টি এর নতুন উদাহরণ তৈরি করব?
উত্তর:
টাইপ ইরেজরের পরে, যা সম্পর্কে T
জানা যায় তা হ'ল এটি কিছু সাবক্লাস Object
। এর উদাহরণগুলি তৈরি করতে আপনাকে কিছু কারখানা নির্দিষ্ট করতে হবেT
।
একটি পদ্ধতির একটি ব্যবহার করতে পারে Supplier<T>
:
class MyClass<T> {
private final Supplier<? extends T> ctor;
private T field;
MyClass(Supplier<? extends T> ctor) {
this.ctor = Objects.requireNonNull(ctor);
}
public void myMethod() {
field = ctor.get();
}
}
ব্যবহার এইরকম দেখতে পারে:
MyClass<StringBuilder> it = new MyClass<>(StringBuilder::new);
বিকল্পভাবে, আপনি একটি Class<T>
বস্তু সরবরাহ করতে পারেন , এবং তারপরে প্রতিবিম্ব ব্যবহার করতে পারেন।
class MyClass<T> {
private final Constructor<? extends T> ctor;
private T field;
MyClass(Class<? extends T> impl) throws NoSuchMethodException {
this.ctor = impl.getConstructor();
}
public void myMethod() throws Exception {
field = ctor.newInstance();
}
}
java.util.function.Supplier
আর একটি অ-প্রতিবিম্বিত পদ্ধতি হ'ল হাইব্রিড বিল্ডার / অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্ন ব্যবহার করা।
কার্যকর জাভাতে, জোশুয়া ব্লচ বিল্ডার প্যাটার্নটি বিশদভাবে নিয়ে গেছে এবং জেনেরিক বিল্ডার ইন্টারফেসের পক্ষে রয়েছে:
public interface Builder<T> {
public T build();
}
কংক্রিট নির্মাতারা এই ইন্টারফেসটি বাস্তবায়ন করতে পারে এবং বাইরের শ্রেণিগুলি কংক্রিট নির্মাতাকে প্রয়োজনীয়ভাবে বিল্ডার কনফিগার করতে ব্যবহার করতে পারে। বিল্ডারকে মাই ক্লাসে পাস করা যেতে পারে একটি হিসাবে Builder<T>
।
এই নিদর্শনটি ব্যবহার করে, আপনি নতুন উদাহরণ পেতে পারেন T
, এমনকি যদি T
কনস্ট্রাক্টর প্যারামিটার থাকে বা অতিরিক্ত কনফিগারেশন প্রয়োজন। অবশ্যই, আপনাকে বিল্ডারকে মাইক্লাসে পাস করার জন্য কিছু উপায়ের প্রয়োজন হবে। আপনি যদি মাইক্লাসে কিছু পাস করতে না পারেন তবে বিল্ডার এবং অ্যাবস্ট্রাক্ট কারখানাটি বাইরে are
এটি আপনি যা খুঁজছেন তার চেয়ে বেশি ভারী ওজন হতে পারে তবে এটি কাজ করবে। মনে রাখবেন যে আপনি যদি এই পদ্ধতিকে অবলম্বন করেন, তবে কারখানাটি মাইক্লাসে ইনজেকশন করা আরও বোধগম্য হবে যখন এটি প্রতিবার বলা হওয়ার পরে আপনার পদ্ধতিতে পাস করার পরিবর্তে এটি তৈরি করা হবে।
interface MyFactory<T>
{
T newObject();
}
class MyClass<T>
{
T field;
public void myMethod(MyFactory<T> factory)
{
field = factory.newObject()
}
}
আপনি যদি সাবক্লাস করতে ইচ্ছুক হন তবে আপনি ক্ষয়টিও এড়াতে পারবেন, http://www.artima.com/weblogs/viewpost.jsp?thread=208860 দেখুন
ক্লাস ক্লাসঅফটি
try {
t = classOfT.newInstance();//new T(); NOTE: type parameter T cannot be instantiated directly
} catch (Exception e) {
e.printStackTrace();
}
Supplier
অবস্থিত? `মাইক্লাস (ক্লাস <? টি> ইম্পল প্রসারিত)` সংকলন করতে অবশ্যই No নোশুচমথোড এক্সেক্সশন` নিক্ষেপ করবে। আপনার উত্তর দুর্ভাগ্যক্রমে জাভা আরম্ভের সাথে বন্ধুত্বপূর্ণ নয়।