Hor*_*ice 28 java generics callable
我遇到了一些高级的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);
}
}
Run Code Online (Sandbox Code Playgroud)
稍后在外部类中,创建了一个可调用类的实例.我不知道这是什么:
ConnectionHelper.<List<ClientCoverageCRU>> tryExecute(coverageCRUDaoCallable);
Run Code Online (Sandbox Code Playgroud)
它对我来说看起来不像java语法.你能详细说明这种神秘的语法会发生什么吗?您可以在代码摘录中看到它在下面使用.
CoverageCRUDaoCallable coverageCRUDaoCallable = new CoverageCRUDaoCallable(
dalClient.getOid(), sourceContextId);
// use Connection helper to make coverageCRUDao call.
List<ClientCoverageCRU> coverageCRUList = ConnectionHelper
.<List<ClientCoverageCRU>> tryExecute(coverageCRUDaoCallable);
Run Code Online (Sandbox Code Playgroud)
EDITED 添加了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;
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*tin 24
您通常认为类是通用的,但方法也可以是通用的.一个常见的例子是Arrays.asList.
大多数情况下<...>,即使在调用泛型方法时,也不必使用尖括号的语法,因为这是Java编译器在某些情况下实际能够进行基本类型推断的地方. .例如,Arrays.asList文档中给出的代码段省略了类型:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
Run Code Online (Sandbox Code Playgroud)
但它相当于这个版本,其中明确给出了泛型类型:
List<String> stooges = Arrays.<String>asList("Larry", "Moe", "Curly");
Run Code Online (Sandbox Code Playgroud)
ass*_*ias 10
这是因为,在Java 7之前,泛型不完全支持目标类型,因此您需要使用所谓的类型见证来帮助编译器ConnectionHelper.<List<ClientCoverageCRU>>.
但请注意,Java 8显着改进了目标类型,在特定示例中,Java 8中不需要类型见证.