টাইপ প্যারামিটার অবজেক্ট অবজেক্ট


90

আমি নীচে একটি টেম্পলেট ক্লাস পেয়েছি:

class MyClass<T>
{
    T field;
    public void myMethod()
    {
       field = new T(); // gives compiler error
    }
}

আমি কীভাবে আমার ক্লাসে টি এর নতুন উদাহরণ তৈরি করব?

উত্তর:


86

টাইপ ইরেজরের পরে, যা সম্পর্কে 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();
  }

}

কোন প্যাকেজে Supplierঅবস্থিত? `মাইক্লাস (ক্লাস <? টি> ইম্পল প্রসারিত)` সংকলন করতে অবশ্যই No নোশুচমথোড এক্সেক্সশন` নিক্ষেপ করবে। আপনার উত্তর দুর্ভাগ্যক্রমে জাভা আরম্ভের সাথে বন্ধুত্বপূর্ণ নয়।
purucat

@ user927387java.util.function.Supplier
এরিকসন

সরবরাহকারী <T> এর যে কোনও জায়গার জন্য জাভা 8, জেএফটিআর প্রয়োজন।
ফ্রান মারজোয়া

14

আর একটি অ-প্রতিবিম্বিত পদ্ধতি হ'ল হাইব্রিড বিল্ডার / অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্ন ব্যবহার করা।

কার্যকর জাভাতে, জোশুয়া ব্লচ বিল্ডার প্যাটার্নটি বিশদভাবে নিয়ে গেছে এবং জেনেরিক বিল্ডার ইন্টারফেসের পক্ষে রয়েছে:

public interface Builder<T> {
  public T build();
}

কংক্রিট নির্মাতারা এই ইন্টারফেসটি বাস্তবায়ন করতে পারে এবং বাইরের শ্রেণিগুলি কংক্রিট নির্মাতাকে প্রয়োজনীয়ভাবে বিল্ডার কনফিগার করতে ব্যবহার করতে পারে। বিল্ডারকে মাই ক্লাসে পাস করা যেতে পারে একটি হিসাবে Builder<T>

এই নিদর্শনটি ব্যবহার করে, আপনি নতুন উদাহরণ পেতে পারেন T, এমনকি যদি Tকনস্ট্রাক্টর প্যারামিটার থাকে বা অতিরিক্ত কনফিগারেশন প্রয়োজন। অবশ্যই, আপনাকে বিল্ডারকে মাইক্লাসে পাস করার জন্য কিছু উপায়ের প্রয়োজন হবে। আপনি যদি মাইক্লাসে কিছু পাস করতে না পারেন তবে বিল্ডার এবং অ্যাবস্ট্রাক্ট কারখানাটি বাইরে are


12

এটি আপনি যা খুঁজছেন তার চেয়ে বেশি ভারী ওজন হতে পারে তবে এটি কাজ করবে। মনে রাখবেন যে আপনি যদি এই পদ্ধতিকে অবলম্বন করেন, তবে কারখানাটি মাইক্লাসে ইনজেকশন করা আরও বোধগম্য হবে যখন এটি প্রতিবার বলা হওয়ার পরে আপনার পদ্ধতিতে পাস করার পরিবর্তে এটি তৈরি করা হবে।

interface MyFactory<T> 
{
    T newObject();
}

class MyClass<T> 
{
    T field;
    public void myMethod(MyFactory<T> factory)
    {
       field = factory.newObject()
    }
}

4
ভাল, অ-প্রতিবিম্বিত পদ্ধতির; প্রতিচ্ছবি সর্বদা একটি বিকল্প হয় না। মাইমেথোদ কি কোনও মাইফ্যাক্টরি </ i> গ্রহণ করতে সক্ষম হবে? টি> প্রসারিত, তাই না?
এরিকসন

4
ভাল কল - আপনি মাইমেথড () তে টি টাইপের টি এবং টি এর সাবক্ল্যাস তৈরি করার অনুমতি দেওয়ার জন্য কারখানায় বাউন্ডেড ওয়াইল্ডকার্ড লাগাতে চাইবেন।
ড্যান হজ


0

একটি বিকল্প হ'ল এটি অবজেক্ট সহ কাস্ট করা

{field = (T) new Object();}

ক্ষেত্রটি প্রথমে অবজেক্ট টাইপ করা হবে তবে এটি টি টাইপ করে ফেলে দেওয়া হবে an তবে আমি মনে করি এটি কার্যকর হবে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.