0

次のシナリオを理解するのに苦労しています。抽象クラスと抽象クラスを拡張する具象クラスによって実装される「汎用化された」インターフェイスがあります。

問題は、パラメータ化されたリストを返す抽象クラスのすべてのメソッドが型を失っているため、オブジェクトから元の List 型に変換できないというコンパイル エラーが発生することです。

誰でも洞察を提供できますか?

java.lang.object 最後に、またはの戻り値の型を持つ抽象クラスに getId および setId メソッドを設定し、戻り値の型を<T extends Object>必要なものに実装する具象クラスを設定することをお勧めします。

これが私のさまざまなオブジェクトのコードです:

汎用インターフェース

public interface MyInterface<T>{

   public T getId();
   public void setId(T id);

}

インターフェイスを実装する抽象クラス

public abstract class MyAbstractClass<T> implements MyInterface<T>{

  private List<String> texts;
  private List<Integer> notes;

   public List<String> getTexts(){
     return texts;
   }

   public List<Integer> getNotes(){
     return notes;
   }
}

抽象クラスを実装する具象クラス

public class MyConcreteClass implements MyAbstractClass<Integer>{

    private Integer id;

    public Integer getId(){
       return this.id;
    }


    public void setId(Integer id){
          this.id = id;
    } 

}

他のクラス:

 public class SomeOtherClass{

   public void process(List<T extends MyAbstractClass> myClassList){

  // Compilation error -> 
  // Type mismatch: cannot convert from element type Object to String  
       for(MyAbstractClass myObj : myClassList){

            System.out.println("object Id : " + myObj.getId());

              // Compilation error -> 
              // Type mismatch: cannot convert from element type Object to String  
             for(String txt : myObj.getTexts()){


             }
       }
   }

}

4

2 に答える 2

4

ジェネリック型MyAbstractClass<T>をraw型(MyAbstractClass)として使用すると、そのメンバーの宣言に含まれるすべてのジェネリック関連のものが無効になります(つまりList<String>、に変わりますList)。

したがって、メソッドの引数をパラメーター化された型として宣言する必要があります。実際の型パラメーターを気にしない場合は、ワイルドカードを使用してください。

public void process(MyAbstractClass<?> myClass) { ... }
于 2013-03-18T10:19:25.077 に答える
1

別のインターフェースが必要だと思います。MyAbstractClass2 つのインターフェイスを実装する場合は、こちらを参照してくださいMyInterface<T>, MyOtherInterface

  public static interface MyInterface<T> {
    public T getId();

    public void setId(T id);
  }

  public static interface MyOtherInterface {
    public List<String> getTexts();

    public List<Integer> getNotes();
  }

  public abstract class MyAbstractClass<T> implements MyInterface<T>, MyOtherInterface {
    private List<String> texts;
    private List<Integer> notes;

    public List<String> getTexts() {
      return texts;
    }

    public List<Integer> getNotes() {
      return notes;
    }
  }

  public static class MyConcreteClass extends MyAbstractClass<Integer> {
    private Integer id;

    public Integer getId() {
      return this.id;
    }

    public void setId(Integer id) {
      this.id = id;
    }
  }

  public class SomeOtherClass {
    public void process(MyOtherInterface myClass) {

      // NO Compilation error
      for (String str : myClass.getTexts()) {
        // some processing
      }
    }
  }
于 2013-03-18T10:24:54.847 に答える