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

有没有办法强制Arrays.asList的返回类型

薛彭薄
2023-03-14
问题内容

我有一个方法返回基类的集合

import java.util.*;
class Base { }
class Derived extends Base { }

Collection<Base> getCollection()
{
    return Arrays.asList(new Derived(),
                         new Derived());
}

由于Arrays.asListList<Derived>)的返回类型与方法(Collection<Base>)的返回类型不匹配,因此无法编译。我理解为什么会这样:由于泛型类型不同,所以两个类之间没有继承关系。

有很多方法可以解决编译器错误,从将方法的返回类型更改为不使用Arrays.asList并将派生对象之一转换为Base。

当解析Arrays.asList调用的通用类型时,有没有办法告诉编译器使用其他但兼容的类型?(我一直在尝试使用这种模式并遇到这个问题,因此,如果有一种使其可行的方法,我想知道这一点。)

我以为你可以做类似的事情

Collection<Base> getCollection()
{
    return Arrays.asList<Base>(new Derived(),
                               new Derived());
}

当我尝试编译该代码(java 6)时,编译器抱怨它在逗号处期望’)’。


问题答案:

您的语法几乎是正确的;该<Base>方法的名称前有云:

return Arrays.<Base>asList(new Derived(),
                           new Derived());

Java 8

对于Java
8,由于其改进的目标类型推断,因此不需要显式类型参数。由于该方法的返回类型为Collection<Base>,因此将类型参数推断为Base

return Arrays.asList(new Derived(),
                     new Derived());

对于Java 7和更低版本,显式类型参数仍然是必需的。您仍然可以在Java 8中提供显式类型参数;这是可选的。



 类似资料:
  • 我只是想知道我是否有可能返回activePodcastViewData。每当我试图在GlobalScopeactivePodcastViewData.Without调用它时,我都不允许返回,我确实让一切正常工作fine.However我更新了我的存储库,将挂起方法添加到it.Hence我正在获取挂起函数应该只从协程或另一个挂起函数调用。 fun getPodcast(podcastSummaryV

  • 问题内容: 我有一种方法可以做很多事情。其中包括进行大量插入和更新。因此宣布… 它的工作完全符合预期,我对此没有任何问题。但是在某些情况下,尽管没有异常,但我还是想强制回滚…目前,当我遇到合适的条件时,我正在强制异常,但这很丑陋,我不喜欢它。 我可以以某种方式积极地调用回滚吗?异常调用它…我在想也许我也可以。 问题答案: 在Spring Transactions中,您使用。 您在这里遇到的问题是您

  • 问题内容: 有没有办法使用泛型说“此方法返回”? 当然,我想在子类中重写此方法,因此声明应与一起使用。 这是一个例子: 根本不起作用:我收到“类型不匹配:无法从Base转换为T”。如果我强制使用强制转换,则覆盖将失败。 问题答案: 不,无法表达这一点。只需声明该方法即可返回类的类型。Java具有协变返回类型,因此无论如何您都可以重写方法以返回更特定的类型。 如果您想为此添加一些标记,则可以随时引入

  • 问题内容: 我是Redis的新手,正在阅读文档,但找不到解决问题的方法。 我有一个包含名称和电话号码的hash,我想获取hash中键的排序列表。 所以我的哈希(电话簿)看起来像这样: 如果我运行,我会得到此信息(密钥将在存储时返回): 我想得到这个(有序键): 我该如何存档?我使用的数据结构正确吗? 问题答案: 您可以使用排序集而不是哈希来实现此目的,并且不需要维护并行列表。全部包含在一个结构中…

  • 我目前正在努力实现一种保护隐私的数据挖掘算法。对于不同各方之间的通信部分,我使用的是Netty 4.0。双方之间的通信流如下所示: 其中是启动和控制整个计算的主方。安全多方乘法的逻辑位于 Netty 中。还有另一种用于安全添加的协议。 目前,我使用类似的解决方案,如Netty核心团队的Norman Maurer所示,以了解子协议计算是否已完成。但这感觉有点像是在对抗框架。 是否有办法从< code

  • 我读过这篇文章:java中arrays.aslist(array)与新arraylist (arrays.aslist(ia))之间的差异 当然,包装器上不允许一些列表操作,比如从列表中添加或删除元素,您只能读取或覆盖元素。 如果list2有List接口的引用,我期望它用Java实现List接口中包含的所有方法。https://docs.oracle.com/javase/7/docs/api/j