我的IDE中出现以下错误:
原始使用参数化类“ GenericContainer”的检查信息: 报告类型参数的参数化类的任何使用 被省略。参数化类型的这种原始用法在Java中是有效的, 但无法达到使用类型参数的目的,并且可能掩盖错误。
我检查了文档,创建者还在各处使用原始类型: https://www.testcontainers.org/quickstart/junit_4_quickstart/ f.e。:
@Rule
public GenericContainer redis = new GenericContainer<>("redis:5.0.3-alpine")
.withExposedPorts(6379);
我不了解这种方法。谁能解释我应该如何参数化GenericContainer <>?
答案 0 :(得分:2)
Testcontainers使用自我键入机制:
class GenericContainer<SELF extends GenericContainer<SELF>> implements Container<SELF> {
...
}
这是一个决定,即使正在扩展类,也要使流利的方法有效:
class GenericContainer<SELF extends GenericContainer<SELF>> implements Container<SELF> {
public SELF withExposedPorts(Integer... ports) {
this.setExposedPorts(newArrayList(ports));
return self();
}
}
现在,即使存在子类,它也会返回最终类型,而不仅仅是GenericContainer
:
class MyContainer extends GenericContainer< MyContainer> {
}
MyContainer container = new MyContainer()
.withExposedPorts(12345); // <- without SELF, it would return "GenericContainer"
仅供参考,Testcontainers 2.0计划更改此方法,您将在以下演示文稿中找到更多信息:
https://speakerdeck.com/bsideup/geecon-2019-testcontainers-a-year-in-review?slide=74