当前位置: 首页 > 面试题库 >

为什么方法不能采用集合 当方法的签名定义为Collection时

楚骞尧
2023-03-14
问题内容

我有一个采用SResource对象列表的方法

public static List<STriple> listTriples(List<SResource> subjects){
//... do stuff
}

我为什么不能这样做

List<IndexResource> resultsAsList = new ArrayList<IndexResource>();
    resultsAsList.addAll(allResults.keySet()); // I could possible not use lists and just use sets and therefore get rid of this line, but that is a different issue
List<STriple> triples = new ArrayList<STriple>();
    triples = TriplesDao.listTriples(resultsAsList);

(编译器告诉我我必须triples使用SResource对象。)

当IndexResource是SResource的子类时

public class IndexResource extends SResource{ 
// .... class code here
}

我本以为必须做到这一点,所以也许我在做其他错误的事情。如果您建议,我可以发布更多代码。


问题答案:

您可以使用通配符:

public static List<STriple> listTriples(List<? extends SResource> subjects){
    //... do stuff
}

新声明使用有 界通配符 ,表示通用参数将是SResource或扩展它的类型。

作为接受List<>这种方式的交换,“做某事”不能包括插入subjects。如果您只是从subjects方法中读取内容,那么此更改将为您提供所需的结果。

编辑 :要查看为什么需要通配符,请考虑以下(在Java中是非法的)代码:

List<String> strings = new ArrayList<String>();
List<Object> objList = string; // Not actually legal, even though string "is an" object
objList.add(new Integer(3)); // Oh no! We've put an Integer into an ArrayList<String>!

那显然不是类型安全的。但是,使用通配符,您 可以 执行以下操作:

List<String> strings = new ArrayList<String>();
string.add("Hello");
List<? extends Object> objList = strings; // Works!
objList.add(new Integer(3)); // Compile-time error due to the wildcard restriction


 类似资料:
  • 问题内容: 我很困惑为什么不允许以下内容: 我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的? 我希望所有类都可以实现该方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法… **_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。 问题答案: 在Java中调用静态方法要

  • 问题内容: 给定golang巡回演出的第54张幻灯片中的设置: 为什么不能同时为结构体和指向结构体的指针定义方法?那是: 定义此将产生以下错误: 问题答案: 它可以。只需在结构而不是指针上定义它即可。它将解决两种方式 方法集 对应的指针类型 T的方法集是接收者 T或T的所有方法的集(即,它也包含T的方法集) 尝试直播:http://play.golang.org/p/PsNUerVyqp 更新:

  • 我不明白这一点: 没有这个,我可以做到: 为什么在第一种情况下我不能调用hello()方法,而在第二种情况下我可以调用?

  • 问题内容: 默认方法是Java工具箱中一个不错的新工具。但是,我试图编写一个定义方法版本的接口。Java告诉我,这是禁止的,因为in中声明的方法可能无法编辑。为什么会这样呢? 我知道有一个“基类始终获胜”规则,因此默认情况下(pun;),方法的任何实现都会被该方法覆盖。但是,我认为没有理由为什么规范中的方法不应有例外。特别是因为它具有默认实现可能非常有用。 那么,Java设计者决定不允许方法覆盖方

  • 问题内容: 编辑: 从Java 8开始,接口中现在允许使用静态方法。 例子如下: 当然这行不通。但是为什么不呢? 可能的问题之一是,当你致电时会发生什么: 在这种情况下,我认为它应该只调用一个空方法(即{})。所有子类都将被强制实现static方法,因此在调用static方法时它们都很好。那为什么不可能呢? 编辑:我想我正在寻找比“因为这就是Java的方式”更深的答案。 有特定的技术原因为什么不能

  • 默认方法是Java工具箱中一个很好的新工具。然而,我试图编写一个接口,定义方法的版本。Java告诉我这是禁止的,因为方法是在可能不是默认值。为什么会是这种情况? 我知道有“基类总是赢”的规则,所以默认情况下(双关语;),方法的任何实现都将被中的方法覆盖。但是,我看不出规范中的中的方法不应该有例外的原因。特别是对于来说,拥有一个默认实现可能非常有用。 那么,Java设计人员决定不允许方法重写中的方法