私はKotlinに新しいですし、言語を使用して、いくつかのプロジェクトを書くために試してみます。私は、Javaライブラリを使用して、私のプロジェクトにライブラリからクラスを拡張し、私はこのエラーメッセージを見ていています。
'public' function exposes its 'public/*package*/' return type argument FooSettings
私は、問題があることを理解が、私はまだKotlinに慣れるをしようとしていますので、Kotlinでそれを修正する方法を確認していません。私はKotlinがスマートであることのみ拡張型で返すようにしようとしていることがわかりますFooSettings
。しかし、問題があるFooSettings
だけでどの手段私はKotlinプロジェクトにアクセスする場合ではないことを、パッケージ公開されています。
私はKotlinのジェネリック医薬品との使用に関するいくつかの研究をしたin
かout
が、私は問題を解決することができませんでした。
私は私が見ていますエラーを修正するために私Kotlinプロジェクトで行うことができます任意の仕事の周りにはありますか?
コードスニペット
これは、Javaライブラリクラスのサンプルです:注、私はライブラリの実装を変更する方法はありません。私は、このライブラリを使用してKotlinでそれを拡張する必要があります。
Javaのライブラリは、このような方法を書かれており、それが上書きされることを期待されていることを私には奇妙に思えるが、それは別の日のための質問です。
import java.util.Collections;
import java.util.List;
public abstract class ClassA {
public List<FooBuilder<?>> getBuilder(Foo foo) {
return Collections.emptyList();
}
}
public class Foo {
}
public abstract class FooBuilder<U extends FooBuilder.FooSettings> {
// implementation of Class
abstract static class FooSettings {
// implementation of Class
}
}
通常のJavaクラスは、このようなのようなメソッドをオーバーライドします:
import java.util.List;
public class MyJavaClassA extends ClassA {
@Override public List<FooBuilder<?>> getBuilder(final Foo foo) {
// implementation
}
}
しかし、私はそれがどのように見えるようにKotlinに記述しようとしています。このKotlinはJavaライブラリに依存して、publicクラスをパッケージ化するためのアクセス権を持っていないことに注意:。
class MyKotlinClassA : ClassA() {
override fun getBuilder(foo: Foo): MutableList<FooBuilder<*>> {
// implementation
}
}
これは、エラーが発生します
'public' function exposes its 'public/*package*/' return type argument FooSettings
私は、「パッケージのパブリック」であなたは「プライベートパッケージ」を意味していることを前提と?あなたの例では、FooBuilder.FooSettings
何の可視性修飾子はとてもプライベートなパッケージのJavaのデフォルトを使用していません。それはあなたが何を意味だと仮定すると、...
あなたは、パッケージプライベートクラスにアクセスすることができますFooSettings
あなたのKotlinコードでは、しかし、あなたは1マッチングのパッケージにそのKotlinコードを入れた場合にのみFooSettings
宣言されています。
あなたはまだ同じコンパイルエラーになりますが、あなたはタイプにアクセスすることはできませんので、それはありません:あなたは、型の宣言よりも表示されているコンテキストでそれを使用しようとしているためです。つまり、あなたは、パッケージプライベート種類を取り、許可されていないパブリックメソッドのシグネチャの一部としてそれを使用しようとしています。ラウンドその問題を取得するには、あなたのようKotlinクラスをマークする必要がありますinternal
。
それのかもしれないもことを言及する価値があることinternal
Kotlin手段のために、それはそれで見えだモジュールではないという点で、パッケージ。これは、すべてのより詳細に説明されてここに。