gpt4 book ai didi

java - com.google.common.collect.Iterables 和实例类型

转载 作者:行者123 更新时间:2023-12-01 17:49:47 24 4
gpt4 key购买 nike

我有一个在 nexus 上执行的 groovy 脚本:

def retentionDays = 30;
def retentionCount = 10;
def repositoryName = 'maven-releases';
def whitelist = ["org.javaee7.sample/javaee7-simple-sample", "org.javaee7.next/javaee7-another-sample"].toArray();

log.info(":::Cleanup script started!");

MaintenanceService service = container.lookup("org.sonatype.nexus.repository.maintenance.MaintenanceService");
def repo = repository.repositoryManager.get(repositoryName);
def tx = repo.facet(StorageFacet.class).txSupplier().get();
def components = null;
try {
tx.begin();
components = tx.browseComponents(tx.findBucket(repo));
}catch(Exception e){
log.info("Error: "+e);
}finally{
if(tx!=null)
tx.close();
}

log.info(" - - A - - Type of 'components.getClass().getName()' is: " + components.getClass().getName());
log.info(" - - B - - Type of 'components' is: " + components);
log.info(" - - C - - Type of 'components.getClass()' is: " + components.getClass());
log.info(" - - D - - Type of 'components[0].getClass()' is: " + components[0].getClass());


log.info(" - - components instanceof com.google.common.collect.Iterables = " + (components instanceof com.google.common.collect.Iterables));

运行时我得到:

     -  - - A - - Type of 'components.getClass().getName()' is: com.google.common.collect.Iterables$4
- - - B - - Type of 'components' is: []
- - - C - - Type of 'components.getClass()' is: class com.google.common.collect.Iterables$4
- - - components instanceof com.google.common.collect.Iterables = false
- - - D - - Type of 'components[0].getClass()' is: class org.codehaus.groovy.runtime.NullObject

为什么 components 不是 com.google.common.collect.Iterables 的实例?

我希望我能做到:

import com.google.common.collect.Iterables
Iterables components = null;
try {
tx.begin();
components = tx.browseComponents(tx.findBucket(repo));
}catch(Exception e){
log.info("Error: "+e);
}finally{
if(tx!=null)
tx.close();
}

但这给出了错误:

Error: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[]' with class 'com.google.common.collect.Iterables$4' to class 'com.google.common.collect.Iterables'

如何强类型化变量:

   def components = null;

当我查看 java 文档时: https://google.github.io/guava/releases/21.0/api/docs/com/google/common/collect/Iterables.html

它看起来不像com.google.common.collect.Iterablesjava.lang.Iterable的子类

根据以下答案我可以做:

Iterable<Component> components = null;

但是我如何在不“猜测”的情况下找到 com.google.common.collect.Iterables$4 呢?

最佳答案

Iterables 是一个实用程序类(仅包含静态方法,无法实例化)。

我猜你的com.google.common.collect.Iterables$4只是一些实现 java.lang.Iterable 的匿名类.

综上所述,定义componentsIterable应该适合你。

<小时/>

编辑:回答您的后续问题:

1) 你写道它看起来不像 Iterables 实现 Iterable ,你是对的 - 事实并非如此。为了了解什么com.google.common.collect.Iterables$4意味着您需要了解 compilation naming rulesanonymous classes .

简而言之,com.google.common.collect.Iterables$4表示“嵌套在 com.google.common.collect.Iterables 类中的第四个匿名类”。

2) 至于如何在不猜测的情况下找到类型 - 您只需跟踪 API 及其返回的内容即可:

注意,上面都是接口(interface),所以从这里我们还是看不出返回的 Iterable<Component> 是如何实现的。已实现。

要了解这一点,我们需要查看实现: StorageTxImpl 。然而,这进一步委托(delegate)了调用,我不想进一步跟踪它(如果您愿意,您可以自己完成;不过,如果在 IDE 中打开这个项目,会更容易) .

但是,我知道那里发生的情况是调用 Guava 的 Iterables 中的方法之一。创建了实用程序类,该类又返回 Iterable<T>通过匿名类的方式实现,仅此而已。

关于java - com.google.common.collect.Iterables 和实例类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51641266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com