Java-使用对象和泛型列表
我对一段简单的Java代码有问题。 我无法确定它是否解决了最初的目的; 写这封信的人(还没找到)就告诉我了 “实现Java-使用对象和泛型列表,java,generics,Java,Generics,我对一段简单的Java代码有问题。 我无法确定它是否解决了最初的目的; 写这封信的人(还没找到)就告诉我了 “实现IA的对象应该是IB类对象的容器(List), 由于强约束(T extensed IB)似乎不合逻辑, 但是IDE编译器没有显示任何相关的错误/警告 如果这样的代码有意义, 有人能提供一个这样的接口的实际使用的例子吗 提前谢谢 import java.util.List; public interface IA<T extends IB<T>> {
IA
的对象应该是IB
类对象的容器(List
),
由于强约束(T extensed IB
)似乎不合逻辑,
但是IDE编译器没有显示任何相关的错误/警告
如果这样的代码有意义,
有人能提供一个这样的接口的实际使用的例子吗
提前谢谢
import java.util.List;
public interface IA<T extends IB<T>> {
public List<T> getList();
}
public interface IB<T> {
public T getValue();
}
import java.util.List;
公共接口{
公共列表getList();
}
公共接口IB{
公共T getValue();
}
更新1:添加了具体样本类别的测试
class Bar implements IA<Foo>{
List<Foo> list;
@Override
public List<Foo> getList() {
return list;
}
Bar(List<Foo> foos) {
this.list = foos;
}
}
class Foo implements IB<Foo> {
public Float data;
@Override
public Foo getValue() {
return foo;
}
Foo(Float data){
this.data = data;
}
public Float getV() {
return data;
}
}
public class DataTest {
@Test
public void myTest() {
Foo f = new Foo(10F);
List<Foo> fs = new ArrayList<>();
fs.add(f);
Bar bar = new Bar(fs);
List<Foo> foos = bar.getList();
System.out.println(foos.get(0).getV());
}
}
类栏实现IA{
名单;
@凌驾
公共列表getList(){
退货清单;
}
酒吧(列出食物){
this.list=foos;
}
}
类Foo实现了IB{
公开浮动数据;
@凌驾
public Foo getValue(){
返回foo;
}
Foo(浮点数据){
这个数据=数据;
}
公共浮动getV(){
返回数据;
}
}
公共类数据测试{
@试验
公共无效myTest(){
Foo f=新的Foo(10F);
List fs=new ArrayList();
财政司司长加入(f);
棒材=新棒材(fs);
List foos=bar.getList();
System.out.println(foos.get(0.getV());
}
}
这是使用IA和IB的正确方法吗?因为
T
只在协变位置使用,所以按原样使用是安全的,所以IA
上的注释可能是正确的。如果IA
有一个接受T
的方法(如int compare(ta,tb)
)在它的一个参数中,这将导致问题,因为它处于逆变位置。因为T
仅用于协变位置,所以可以安全地使用它,因此对IA
的注释可能是正确的。如果IA
有一个接受T
的方法(如int compare(ta,tb)
)在它的一个参数中,这会导致问题,因为它处于逆变位置。这样的约束在某些情况下是有意义的。例如,如果要创建一个排序列表类,可以执行以下操作
class SortedList<T extends Comparable<? super T>>
其中,您有一个实现类,它本身是泛型的(具有相同的
绑定),它需要一个T
并生成更多的T
s,直到它达到null
,并返回这些类的列表
虽然这仍然不要求接口
IA
具有约束,因此我猜它仍然没有提供一个示例,说明必须对IA
的参数进行绑定。这样的约束在某些情况下是有意义的。例如,如果您想要创建一个排序列表类,您可以执行以下操作:e
class SortedList<T extends Comparable<? super T>>
其中,您有一个实现类,它本身是泛型的(具有相同的
绑定),它需要一个T
并生成更多的T
s,直到它达到null
,并返回这些类的列表
尽管这仍然不要求接口
IA
具有约束,因此我猜它仍然没有提供一个示例,说明IA
的参数的绑定是必要的。您可能会发现查找IA
的类型参数示例是有用的。而查找de的边界并不特别罕见以这种方式声明(例如看),在IA
上声明了这样一个界限,但在IB
上却没有,这有点令人惊讶。不幸的是,如果没有其他代码中类型参数的例子,我们很难猜到这里的意图。我找不到这种构造IA
的实际例子。t
如何扩展Clazz
?通常如果您看到
,则表示T
是一个Foo
,其类型参数是其自身的类型。例如,类栏扩展了Foo{}
。是一个枚举
。在您的示例中,如果执行了类Foo实现了IB{}
,则getValue()
将返回一个Foo
。问题中代码的奇怪之处在于,绑定未在IB
中声明,因此这是IA
对列表中元素的一些特殊期望。问题已更新。这是使用IA和IB的正确方法吗?您可能会发现查找ar类型的示例很有帮助guments toIA
。虽然找到以这种方式声明的边界并不特别少见(例如,查看),在IA
上声明了这样一个界限,但在IB
上却没有,这有点令人惊讶。不幸的是,如果没有其他代码中类型参数的例子,我们很难猜到这里的意图。我找不到这种构造IA
的实际例子。t
如何扩展Clazz
?通常如果您看到
,则表示T
是一个Foo
,其类型参数是其自身的类型。例如,类栏扩展了Foo{}
。是一个枚举
。在您的示例中,如果执行了类Foo实现了IB{}
,则getValue()
将返回一个Foo
。问题中代码的奇怪之处在于,绑定未在IB
中声明,因此这是IA
对列表中元素的一些特殊期望。问题已更新。这是使用IA和IB的正确方法吗?谢谢你的回答。我不明白的一点是:in为了满足IA@AlessioBarrile:这取决于IA
表示的内容以及.getValue()
设计用于返回的内容。例如,当您执行生成器模式时,您可能希望该方法返回自身,以便可以链接调用。感谢您的帮助