0

我在理解以下场景时遇到了一些麻烦。我有一个由抽象类和扩展抽象类的具体类实现的“通用”接口。

问题是返回参数化列表的抽象类中的所有方法都丢失了它们的类型,所以我收到一个编译错误,告诉我它无法从对象转换为原始 List 类型。

谁能提供一些见解?

最后,我想要的是在抽象类上有一个 getId 和 setId 方法,其返回类型为java.lang.object or <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>用作原始类型 ( MyAbstractClass) 时,其成员声明中与泛型相关的所有内容都被禁用(即List<String>变为List)。

因此,您需要将方法的参数声明为参数化类型。如果您不关心实际类型参数,请使用通配符:

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

我认为您需要另一个界面。请参阅此处MyAbstractClass实现两个接口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 回答