我遇到了一些高级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从中提取特定行时遇到了一些麻烦。我想提取所有在第三列中指定的“基因”或“外显子”类型的行。当这不起作用时,我感到很惊讶: 没有结果返回。我哪里出问题了? 问题答案: 您需要逃脱。以下应做的工作。
问题内容: 这个问题已经在这里有了答案 : 如何进行列表理解中的作业? (6个答案) 4年前关闭。 我不确定在循环中使用运算符时为什么不能在列表理解中使用运算符? 问题答案: 赋值运算符(及其上的所有变体)在Python中构成一个 语句 ,而不是一个 expression 。不幸的是,列表推导(以及其他推导,如集合,字典和生成器)仅支持表达式。
问题内容: 我正在从OracleDocGenericMethod中阅读有关泛型方法的信息。当比较指出何时使用通配符以及何时使用通用方法时,我对此感到非常困惑。引用文档。 我们可以在这里使用通用方法: […]这告诉我们类型参数正在用于多态。它的唯一作用是允许在不同的调用站点使用各种实际的参数类型。在这种情况下,应使用通配符。通配符旨在支持灵活的子类型化,这就是我们在此要表达的内容。 我们难道不认为像
有人能告诉我用两种不同的方法调用同一个函数的区别,以及编译器在这两种情况下到底做了什么;比如:
问题内容: 我有一个元组,列出了像这样的类的方法: 等等.. 现在,我需要根据用户做出的选择动态调用这些方法。该方法将基于索引被调用。因此,如果用户选择“ 0”,则称为,如果“ 5”,则称为。 我这样做的方法如下: 我设法解决了一些问题,但是会产生错误并且一点也不优雅。 问题答案: 如果要在对象(包括导入的模块)上调用方法,则可以使用: 例如: 如果您需要在当前模块中调用函数 要发送的参数列表或元
问题内容: 我想以查询其他字段的相同方式将多值字段的值查询为单独的“字段”。我有这样的数据结构: 我的查询如下所示: 仅当值包含我的整个查询时,“类型”和“运算符”才能完美匹配单个值字段。例如,查询“ foo two”不会返回匹配项。 我希望标签字段的行为相同。现在,查询“东西”将在不应该返回匹配项时返回匹配项,因为没有字段或标记值将两个单词都包含在一个值中。有没有办法做到这一点? 编辑 Val的