سؤال

منذ الأدوية تم إدخال فئة parametrized ، بحيث List.class تنتج فئة<List>.هذا هو واضح.

ما أنا لست قادرا على معرفة كيفية الحصول على مثيل فئة من النوع الذي parametrized نفسها ، أيالدرجة<List<String>>.في هذا المقتطف:

public class GenTest {
    static <T> T instantiate(Class<T> clazz) throws Exception {
        return clazz.newInstance();
    }
    public static void main(String[] args) throws Exception {
        // Is there a way to avoid waring on the line below
        // without using  @SuppressWarnings("unchecked")?
        // ArrayList.class is Class<ArrayList>, but I would like to
        // pass in Class<ArrayList<String>>
        ArrayList<String> l = GenTest.instantiate(ArrayList.class);
    }
}

قابلت نماذج من هذه المشكلة في كثير من الأحيان و أنا ما زلت لا أعرف إذا فاتني شيء ما ، أو إذا كان هناك حقا أي طريقة أفضل.شكرا على الاقتراحات.

هل كانت مفيدة؟

المحلول

الفئة فئة وقت التشغيل تمثيل نوع.منذ parametrized أنواع الخضوع نوع المحو في وقت التشغيل ، كائن فئة لفئة سيكون نفس الدرجة<List<Integer>> والطبقة<List<String>>.

السبب في أنك لا مثيل لهم استخدام .الطبقة التدوين هو أن هذا هو بناء جملة خاص تستخدم فئة حرفية.على لغة جافا مواصفات يحظر تحديدا هذه الجملة عندما اكتب هو parametrized, وهذا هو السبب قائمة<String>.فئة لا يسمح.

نصائح أخرى

فصول تمثل الطبقات تحميلها من قبل فئة محمل ، والتي الخام أنواع.تمثل معلمات نوع استخدام جافا.لانغ.تعكس.ParameterizedType.

أنا لا أعتقد أنه يمكنك أن تفعل ما كنت تحاول.أولا, لديك مثيل الأسلوب لا تعرف أن تتعامل مع parameterised نوع (هل يمكن بسهولة مثلما تمر عليه java.util.Date.class).وثانيا لأن من المحو, تفعل أي شيء خاصة محددة مع parameterised أنواع في وقت صعب أو مستحيل.

إذا كنت تريد معالجة المشكلة بطريقة مختلفة ، وهناك غيرها من الحيل الصغيرة التي يمكنك القيام به ، مثل نوع الاستدلال:

public class GenTest
{
    private static <E> List<E> createList()
    {
        return new ArrayList<E>();
    }

    public static void main(String[] args)
    {
        List<String> list = createList();
        List<Integer> list2 = createList();
    }
}

الشيء الوحيد الذي يمكنك القيام به هو إنشاء مثيل List<String> مباشرة و الاتصال getClass():

instantiate(new List<String>() { ... }.getClass());

على أنواع متعددة الأساليب التجريدية مثل List, هذا محرجا جدا.ولكن للأسف, داعيا فرعية منشئات (مثل new ArrayList<String>) أو أساليب المصنع (Collections.<String>emptyList()) لا تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top