3

我有这个问题,我想只在if块之后返回接口和实现类的列表。

public interface Lotto { }

public class LottoImplSecond implements Lotto { }
public class LottoImplFirst implements Lotto { }

public class MyClass {
   public List<Lotto> getLotto(Integer number){
       if(number==1) List<Lotto> listaLotto=new ArrayList<LottoImplFirst>();
       else if(number==2) List<Lotto> listaLotto=new ArrayList<LottoImplSecond>();
   return listaLotto;
}
4

7 回答 7

12
public interface Lotto { }

public class LottoImplSecond implements Lotto { }
public class LottoImplFirst implements Lotto { }

public class MyClass {
   public List<? extends Lotto> getLotto(Integer number){
       List<? extends Lotto> listaLotto;
       if(number==1) listaLotto=new ArrayList<LottoImplFirst>();
       else if(numeber==1) listaLotto=new ArrayList<LottoImplSecond>();
       return listaLotto;
    }
}
于 2012-08-21T08:48:30.163 回答
3

FirstList<Lotto>不是List<LottoImplSecond>orList<LottoImplFirst>所以你需要返回一个超类型List<? extends Lotto>

列表的问题List<? extends Lotto>您只能从中获取并且永远不会添加到它(安全,没有编译器警告)

于 2012-08-21T08:57:53.080 回答
2

如果您返回List<Lotto>,则内部是否使用特定类型都没有关系,实际上,您不能这样做,因为ArrayList<LottoImplFirst>它不是List<Lotto>. 你实际上可以这样做:

public List<Lotto> getLotto(Integer number){
   return new ArrayList<Lotto>();
}

(另请注意,您listaLotto在语句中声明了变量 ( ) if-else,因此 return 语句超出了它们的范围。

于 2012-08-21T08:50:39.060 回答
2

你的台词

if(number==1) List<Lotto> listaLotto=new ArrayList<LottoImplFirst>();
else if(numeber==1) List<Lotto> listaLotto=new ArrayList<LottoImplSecond>();

就调用您的方法的代码而言,一无所获。这两个列表对于您的来电者来说绝对无法区分。我建议你只写

listaLotto = new ArrayList<Lotto>();

相应地调整返回类型并完成它。

附注:您的代码不是可编译的 Java,但这是一个小问题。

于 2012-08-21T08:52:31.600 回答
0

if 和 else 的条件相同。泛型继承不同于 Java 继承。

 public List<Lotto> getLotto(Integer number)
{
    return ((List<Lotto>)(number == 1 ? new ArrayList<LottoImplFirst>() : new ArrayList<LottoImplSecond>());
}
于 2012-08-21T08:51:41.737 回答
0

您的代码中有许多错误,但我认为您想要做的是将getLotto方法签名更改为:

public List<? extends Lotto> getLotto(Integer number);

您还必须listaLotto在语句之外进行定义if,以便在您尝试使用它时它仍在范围内return

另请注意,else if条件上有一个错字 - 我认为它应该测试 if number == 1,尽管目前这永远不会像原始if条件测试 if一样执行number == 1

完整的解决方案(假设第二个value是 2)如下所示:

public interface Lotto { }

public class LottoImplSecond implements Lotto { }
public class LottoImplFirst implements Lotto { }

public class MyClass {
   public List<? extends Lotto> getLotto(Integer number){
       List<? extends Lotto> listaLotto;
       if(number==1) {
            listaLotto=new ArrayList<LottoImplFirst>();
       }
       else if(number==2) {
            listaLotto=new ArrayList<LottoImplSecond>();
       }
       return listaLotto;
    }
}
于 2012-08-21T08:51:59.587 回答
0

试试这个。我刚刚编译它:

class MyClass {
   public List<? extends Lotto> getLotto(Integer number){

       List<? extends Lotto> listaLotto = null; 

       if(number==1) {
           listaLotto= new ArrayList<LottoImplFirst>();
       }           
       else if(number ==1) {
           listaLotto=new ArrayList<LottoImplSecond>();
       }
   return listaLotto;
}
}
于 2012-08-21T08:54:05.843 回答