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>> {

我对一段简单的Java代码有问题。 我无法确定它是否解决了最初的目的; 写这封信的人(还没找到)就告诉我了 “实现
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 to
IA
。虽然找到以这种方式声明的边界并不特别少见(例如,查看),在
IA
上声明了这样一个界限,但在
IB
上却没有,这有点令人惊讶。不幸的是,如果没有其他代码中类型参数的例子,我们很难猜到这里的意图。我找不到这种构造
IA
的实际例子。
t
如何扩展
Clazz
?通常如果您看到
,则表示
T
是一个
Foo
,其类型参数是其自身的类型。例如,
类栏扩展了Foo{}
。是一个
枚举
。在您的示例中,如果执行了
类Foo实现了IB{}
,则
getValue()
将返回一个
Foo
。问题中代码的奇怪之处在于,绑定未在
IB
中声明,因此这是
IA
对列表中元素的一些特殊期望。问题已更新。这是使用IA和IB的正确方法吗?谢谢你的回答。我不明白的一点是:in为了满足
IA@AlessioBarrile:这取决于
IA
表示的内容以及
.getValue()
设计用于返回的内容。例如,当您执行生成器模式时,您可能希望该方法返回自身,以便可以链接调用。感谢您的帮助