Java 泛型,返回泛型扩展

标签 java generics

为什么不允许我这样做?

public abstract class A {}
public class B extends A {}
...

public ArrayList<A> foo()
{
  return new ArrayList<B>();
}

我改为公开,因为有很多人喜欢指出愚蠢的错误。

为什么我必须编写所有这些代码。就为了满足Java的胡说八道?

public List<A> foo() 
{ 
  List<A> aList = new ArrayList<A>(); 
  List<B> bList = new ArrayList<B>();
  /* fill bList*/

  for (B b : bList)
  {
    aList.add(b);
  }
  return aList;
}

最佳答案

ArrayList<B>不是 ArrayList<A> .您不能添加任意 A例如,进入其中。或者我喜欢这样想:一串香蕉不是水果碗。当您尝试在一堆香蕉中添加一个苹果时,它会滚落...

不过您可以使用通配符使其工作:

public ArrayList<? extends A> foo()
{
    return new ArrayList<B>();
}

参见 Java Generics FAQ了解更多详情。

编辑:回答您为什么需要编写所有这些额外代码的具体问题:您不需要。只需创建一个 ArrayList<A>foo() 内开始。无需将一个列表的内容复制到另一个列表。

如果您仍然反对 Java 的行为,您希望以下代码发生什么?

// Doesn't compile, fortunately...
List<String> strings = new List<String>();
List<Object> objects = strings;
objects.add(new Date());
String string = strings.get(0); // Um, it's a Date, not a String...

关于Java 泛型,返回泛型扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4657132/

相关文章:

java - 将 1's and 0' 的序列拆分为字节

java - 找不到符号导入 com.user.userCom

c# - 创建使用通用参数的通用服务接口(interface)

java - 具有多线程和实例共享的泛型

Javascript 通用 For 循环

java - 在 Hyperledher Fabric V1.0 的本地开发环境中使用 fabric 客户端 java sdk(因为没有 Rest API 支持)时出现问题

java - 日期选择器上的 nullPointerException

java - 是否可以通过它的 key 同步 ConcurrentHashMap 更新?

class - 如何编写枚举类型的 Swift 泛型函数?

Java递归泛型类通配符匹配