لماذا يتطلب عامل انتشار Kotlin toTypedArray () عند تمرير وسيطة vararg البدائية؟

4

لدي تطبيق Android مكتوب بنسبة 100 ٪ في Kotlin.

في صفي اختبار الوحدة ، لدي مراقبون اختبار ، أحدهما يراقب الأعداد الصحيحة ، والآخر - كائنات:

val conversationCountObserver: TestObserver<Int>
val conversationObserver: TestObserver<Conversation>

لكل واحد أريد القيام ببعض التأكيدات الأساسية ، مثل التحقق من عدم وجود أخطاء والتحقق من القيم التي تمت ملاحظتها. أقرر كتابة طريقة عامة يمكنها إجراء عدد من التأكيدات على قائمة العناصر في فئة RX TestObserver ، وطريقتين وكيلتين لتمرير المراقب المقابل ومجموعة متنوعة من القيم عبر عامل انتشار Kotlin *:

private fun thenConversationsNotified(vararg conversations: Conversation) {
    thenTestObserverNotified(conversationObserver, *conversations)
}

private fun thenConversationCountNotified(vararg counts: Int) {
    thenTestObserverNotified(conversationCountObserver, *counts)
}

private fun <T>thenTestObserverNotified(observer: TestObserver<T>, vararg elements: T) {
    observer.assertNoErrors()
    elements.forEachIndexed { index, element ->
        observer.assertValueAt(index, element)
    }
}

تعمل طريقة thenConversationsNotified () على ما يرام ، إلا أن طريقة thenConversationCountNotified () تُظهر خطأ:

Imagen 72

Imagen 73

بعد قراءة مستندات Kotlin ( http://kotlinlang.org/docs/reference/java-interop.html#java-arrays ) أدركت أن مجموعة متنوعة من الأنواع البدائية تخلق في الواقع كائن IntArray بدلاً من Array ، وقد تم ذلك على أنه حل Java interop ، الذي يعالج اختلافات الأوليات بشكل مختلف عن الكائنات. لذلك ، يجب أن أعيد كتابة ثم التحويل إلى إعلام باستخدام totoTypedArray ():

private fun thenConversationCountNotified(vararg counts: Int) {
    thenTestObserverNotified(conversationCountObserver, *counts.toTypedArray())
}

لماذا لا يعمل عامل الانتشار على فئة صفيف بدائية بنفس الطريقة التي تعمل بها على صفيف من الكائنات؟ هل هناك طريقة لإزالة المكالمة إلى. toTypedArray () هنا؟

ملاحظة: في الرابط أعلاه ، يعلنون عن intArrayOf (1،2،3) الذي يعيد IntArray ، وعند تمريره إلى الطريقة الأخرى ، يعمل عامل الانتشار بشكل جيد. لذلك يعمل عامل الانتشار مع فئة IntArray. الفرق الوحيد بين مثال في مستندات Kotlin وأسلوبي هو أن لدي معلمتين في طريقة ، واحدة ملموسة وأخرى vararg.

1 إجابة

3
افضل جواب

عندما Int يستخدم نوع كوسيطة نوع (يستبدل T في حالتك) ، لا يمكن استخدام بدائية JVM ، وهو تقييد JVM (لديه توقيع طريقة واحدة مع java.lang.Object بدلاً من معلمة النوع ، وبالتالي لا يمكنها قبول البدائيين).

ال vararg يعقد القضية ، ولكن ، تحت غطاء ، وظيفة قبول vararg elements: T هو نفسه كما لو قبلت Array<T> .

لذا عليك المرور Array<Int> (صفيف من الأعداد الصحيحة المعبأة) بدلا من IntArray (مجموعة البدائية) ، و .toTypedArray() الوظيفة هي الطريقة للحصول على السابق.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام