我遇到了一些高级的java代码(对我来说很先进:))我需要帮助理解.
在类中有一个嵌套类,如下所示:
private final class CoverageCRUDaoCallable implements Callable> { private final long oid; private final long sourceContextId; private CoverageCRUDaoCallable(long oid, long sourceContextId) { this.oid = oid; this.sourceContextId = sourceContextId; } @Override public List
call() throws Exception { return coverageCRUDao.getCoverageCRUData(oid, sourceContextId); } }
稍后在外部类中,创建了一个可调用类的实例.我不知道这是什么:
ConnectionHelper.> tryExecute(coverageCRUDaoCallable);
它对我来说看起来不像java语法.你能详细说明这种神秘的语法会发生什么吗?您可以在代码摘录中看到它在下面使用.
CoverageCRUDaoCallable coverageCRUDaoCallable = new CoverageCRUDaoCallable( dalClient.getOid(), sourceContextId); // use Connection helper to make coverageCRUDao call. ListcoverageCRUList = ConnectionHelper . > tryExecute(coverageCRUDaoCallable);
EDITED 添加了ConnectionHelper类.
public class ConnectionHelper{ 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 tryExecute(Callable 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; }
Chris Martin.. 24
您通常认为类是通用的,但方法也可以是通用的.一个常见的例子是Arrays.asList
.
大多数情况下<...>
,即使在调用泛型方法时,也不必使用尖括号的语法,因为这是Java编译器在某些情况下实际能够进行基本类型推断的地方. .例如,Arrays.asList
文档中给出的代码段省略了类型:
Liststooges = Arrays.asList("Larry", "Moe", "Curly");
但它相当于这个版本,其中明确给出了泛型类型:
Liststooges = Arrays. asList("Larry", "Moe", "Curly");
这只是一个惯例问题.如果你愿意,有很多地方可以插入多余的空格.你也可以写`List
assylias.. 10
这是因为,在Java 7之前,泛型不完全支持目标类型,因此您需要使用所谓的类型见证来帮助编译器ConnectionHelper.
.>
但请注意,Java 8显着改进了目标类型,在特定示例中,Java 8中不需要类型见证.