Почему Socket не является экземпляром Closeable во время выполнения?

В Android-приложении я добавил этот код в onCreate()

    Closeable sss = new Socket();
    if (!(sss instanceof Closeable)) {
        throw new RuntimeException("Something unexpected happened");
    }

Импорт:

import java.io.Closeable;
import java.net.Socket;

Код компилируется, но Я получаю исключение:

E/AndroidRuntime( 8293): java.lang.RuntimeException: Unable to start activity...: java.lang.RuntimeException: Something unexpected happened
...
E/AndroidRuntime( 8293): Caused by: java.lang.RuntimeException: Something unexpected happened
...

В другом контексте глюк вызывает java.lang.ArrayStoreException (а именно, java.lang.ArrayStoreException: java.net.Socket не может быть сохранен в массиве типа java.io.Closeable []).

Я что-то упустил? Любая идея, что делать?

ИЗМЕНИТЬ Аналогично, когда DatagramSocket используется как MyClass<DatagramSocket> для MyClass<T extends Closeable>, он вызывает java.lang.IncompatibleClassChangeError: интерфейс не реализован.

4b9b3361

Эта проблема возникает на уровнях API Android до 19. В затронутых версиях Socket не реализует Closeable.

Источники:

3
ответ дан 23 апр. '15 в 16:58
источник

Socket сам по себе не может быть закрыт, но оба его потока. И закрытие любого потока закроет Socket

2
ответ дан 23 апр. '15 в 16:47
источник

Для будущих читателей я хочу прояснить то, что предполагалось очевидным для всех в этом обсуждении:

Как я могу назначить Closeable sss = new Socket();, если Socket не Closeable?

Требования API, указанные в AndroidManifest.xml, следующие:

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="19" />

и отчеты устройства

android.os.Build.VERSION.SDK_INT=16

Код был скомпилирован для уровня API 19, поэтому он был успешно скомпилирован. Но он был запущен на уровне API 16, и именно поэтому он потерпел неудачу.

Другими словами, проверка времени компиляции была выполнена для API19 на одном компьютере (настольный ПК), в то время как проверка выполнения была выполнена для API16 на другом компьютере (карманное устройство).

0
ответ дан 24 апр. '15 в 10:17
источник