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

使用点运算符在Java中进行奇数方法调用以访问通用列表

琴献
2023-03-14
问题内容

我遇到了一些高级Java代码(对我来说是高级的:)),我需要帮助来理解。

在一个类中,有一个嵌套的类,如下所示:

private final class CoverageCRUDaoCallable implements
        Callable<List<ClientCoverageCRU>>
{
    private final long oid;
    private final long sourceContextId;

    private CoverageCRUDaoCallable(long oid, long sourceContextId)
    {
        this.oid = oid;
        this.sourceContextId = sourceContextId;
    }

    @Override
    public List<ClientCoverageCRU> call() throws Exception
    {
        return coverageCRUDao.getCoverageCRUData(oid, sourceContextId);
    }
}

在外部类的后面,有一个正在创建的可调用类的实例。我不知道这是什么:

ConnectionHelper.<List<ClientCoverageCRU>> tryExecute(coverageCRUDaoCallable);

在我看来,它看起来不像Java语法。您能否详细说明这种神秘的语法是怎么回事?您可以在下面的代码摘录中看到它的使用情况。

CoverageCRUDaoCallable coverageCRUDaoCallable = new CoverageCRUDaoCallable(
        dalClient.getOid(), sourceContextId);

// use Connection helper to make coverageCRUDao call.
List<ClientCoverageCRU> coverageCRUList = ConnectionHelper
        .<List<ClientCoverageCRU>> tryExecute(coverageCRUDaoCallable);

编辑 添加了ConnectionHelper类。

public class ConnectionHelper<T>
{
    private static final Logger logger =
        LoggerFactory.getLogger(ConnectionHelper.class);

    private static final int    CONNECTION_RETRIES = 3;

    private static final int    MIN_TIMEOUT        = 100;

    public static <T> T tryExecute(Callable<T> command)
    { 
        T returnValue = null;
        long delay = 0;

        for (int retry = 0; retry < CONNECTION_RETRIES; retry++)
        { 
            try
            { 
                // Sleep before retry
                Thread.sleep(delay);

                if (retry != 0)
                {
                    logger.info("Connection retry #"+ retry);
                }

                // make the actual connection call
                returnValue = command.call();
                break;

            } 
            catch (Exception e)
            {
                Throwable cause = e.getCause();
                if (retry == CONNECTION_RETRIES - 1)
                {
                    logger.info("Connection retries have exhausted. Not trying "                        
                            + "to connect any more.");

                    throw new RuntimeException(cause);
                }

                // Delay increased exponentially with every retry.
                delay = (long) (MIN_TIMEOUT * Math.pow(2, retry));

                String origCause = ExceptionUtils.getRootCauseMessage(e);

                logger.info("Connection retry #" + (retry + 1)
                        + " scheduled in " + delay + " msec due to "
                        + origCause);
                        + origCause);
            }
        }
        return returnValue;
    }

问题答案:

您通常会认为类是通用的,但是方法也可以是通用的。一个常见的例子是Arrays.asList

大多数时候,<...>即使在调用通用方法时,也不必在尖括号中使用语法,因为在某些情况下,这是Java编译器实际上能够进行基本类型推断的地方。例如,Arrays.asList文档中给出的代码片段省略了类型:

List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

但这等效于显式给出泛型的该版本:

List<String> stooges = Arrays.<String>asList("Larry", "Moe", "Curly");


 类似资料:
  • 问题内容: 以下是一个名为AT5G60410.gff的大文件的示例: 我在使用grep从中提取特定行时遇到了一些麻烦。我想提取所有在第三列中指定的“基因”或“外显子”类型的行。当这不起作用时,我感到很惊讶: 没有结果返回。我哪里出问题了? 问题答案: 您需要逃脱。以下应做的工作。

  • 问题内容: 我正在从OracleDocGenericMethod中阅读有关泛型方法的信息。当比较指出何时使用通配符以及何时使用通用方法时,我对此感到非常困惑。引用文档。 我们可以在这里使用通用方法: […]这告诉我们类型参数正在用于多态。它的唯一作用是允许在不同的调用站点使用各种实际的参数类型。在这种情况下,应使用通配符。通配符旨在支持灵活的子类型化,这就是我们在此要表达的内容。 我们难道不认为像

  • 有人能告诉我用两种不同的方法调用同一个函数的区别,以及编译器在这两种情况下到底做了什么;比如:

  • 问题内容: 这个问题已经在这里有了答案 : 如何进行列表理解中的作业? (6个答案) 4年前关闭。 我不确定在循环中使用运算符时为什么不能在列表理解中使用运算符? 问题答案: 赋值运算符(及其上的所有变体)在Python中构成一个 语句 ,而不是一个 expression 。不幸的是,列表推导(以及其他推导,如集合,字典和生成器)仅支持表达式。

  • 问题内容: 由于Java不支持指针,如何像在C和C ++中那样通过Java引用来调用函数? 问题答案: 在Java中,真正的按引用传递是不可能的。Java通过值传递所有内容,包括引用。但是您可以使用容器对象来模拟它。 使用以下任何一个作为方法参数: 数组 集合 AtomicXYZ类 并且,如果您在方法中更改其内容,则更改的内容将可用于调用上下文。 糟糕,您的意思显然是通过引用调用方法。在Java中

  • 问题内容: 我有一个元组,列出了像这样的类的方法: 等等.. 现在,我需要根据用户做出的选择动态调用这些方法。该方法将基于索引被调用。因此,如果用户选择“ 0”,则称为,如果“ 5”,则称为。 我这样做的方法如下: 我设法解决了一些问题,但是会产生错误并且一点也不优雅。 问题答案: 如果要在对象(包括导入的模块)上调用方法,则可以使用: 例如: 如果您需要在当前模块中调用函数 要发送的参数列表或元