У меня возникли проблемы с выражением try- with-resources в Котлине. Насколько я понимаю, каждое выражение, являющееся экземпляром AutoClosable
, должно предоставлять функцию расширения use
.
Вот полный пример:
import java.io.BufferedReader;
import java.io.FileReader;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
public class Test {
static String foo(String path) throws Throwable {
try (BufferedReader r =
new BufferedReader(new FileReader(path))) {
return "";
}
}
static String bar(TupleQuery query) throws Throwable {
try (TupleQueryResult r = query.evaluate()) {
return "";
}
}
}
Конвертер Java-to-Kotlin создает следующие выходные данные:
import java.io.BufferedReader
import java.io.FileReader
import org.openrdf.query.TupleQuery
import org.openrdf.query.TupleQueryResult
object Test {
@Throws(Throwable::class)
internal fun foo(path: String): String {
BufferedReader(FileReader(path)).use { r -> return "" }
}
@Throws(Throwable::class)
internal fun bar(query: TupleQuery): String {
query.evaluate().use { r -> return "" } // ERROR
}
}
foo
работает нормально, но код в bar
не компилируется:
Error:(16, 26) Kotlin: Unresolved reference.
None of the following candidates is applicable
because of receiver type mismatch:
public inline fun <T : java.io.Closeable, R>
???.use(block: (???) -> ???): ??? defined in kotlin.io
query.evaluate()
от Sesame и реализует AutoClosable
. Это ошибка Kotlin или есть причина, по которой она не работает?
Я использую IDEA 15.0.3 с Kotlin 1.0.0-beta-4584-IJ143-12 и следующей версией sasame-runtime
:
<groupId>org.openrdf.sesame</groupId>
<artifactId>sesame-runtime</artifactId>
<version>4.0.2</version>