私は何をしようとしているかを説明するための簡単なインターフェイス継承の例を書きました。インターフェイスを実装するクラスの変数を呼び出す/代入する
interface Fruit{
public void taste();
}
class Banana implements Fruit {
public String name = "Banana";
public void taste(){
System.out.println("yummy banana!");
}
class Strawberry implements Fruit {
public String name = "Strawberry";
public void taste(){
System.out.println("yummy strawberry!");
}
}
class Lunch<Fruittype implements Fruit> {
public Fruittype fruit;
public void tasteit() {
System.out.println("I'm going to eat a"+ fruit.name + "!");
// error: name cannot be resolved or is not a field
fruit.taste();
}
}
class exec {
public static void main(String[] args) {
Lunch<Banana> bananalunch = new Lunch<>;
bananalunch.fruit = new Banana();
bananalunch.tasteit();
}
}
だから、バナナとイチゴがフルーツを実装しています。クラスランチでは、果物の名前とその機能の味を呼ぼうとしています。 (参照:コメントのエラーを)機能味がうまく動作しますが、私は名前を呼び出すことはできません呼び出し中:私はバナナを食べに行くよ
は出力を募集! おいしいバナナ!
私が言ったように、おいしいバナナは動作しますが、その名前は解決できません。私は "public String name =" default ""を宣言しようとしました。 Fruitインタフェースでは、その後、それを呼び出すことができますが、実際のクラスの名前ではなく、常に「デフォルト」と表示されます。
インタフェースを実装する汎用タイプのメンバーを取得する方法はありますか? P.P.私はこのようにしなければなりません。もちろん、このコードは表現のためだけですが、私はこの問題に遭遇したより複雑なコードをはるかに多く持っています。そして、必要でない場合には再構成したくありません。
ありがとうございます!
インタフェースに 'getName()'メソッドを追加し、そのインタフェースの実装で標準のgetter/setterメソッドを実装します。 (もちろん、「名前」はプライベートにしてください) – David