gpt4 book ai didi

java - 从类型绑定(bind)中使用的泛型类型访问类型参数

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:50 25 4
gpt4 key购买 nike

我发现泛型存在以下问题。考虑通用接口(interface)

public interface A<X> {
X get();
void doStuff(X x);
}

现在,让我们假设以下方法定义:

public <T extends A<?>> void foo(T t) {
bar(t);
}

由于通配符,get()返回类型的类型信息不足。因此,我必须委托(delegate)另一个方法将这个通配符“绑定(bind)”到一个新的类型变量:

private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}

不允许在 foo 中调用 bar(),编译器输出以下错误消息:

The method bar(A) in the type test is not applicable for the arguments (T)

但是,如果我将方法 foo() 更改为

public <T extends A<?>> void foo(T t) {
A<?> u = t; // No explicit cast required, no "unchecked" warning!
bar(u);
}

它有效。为什么?这是编译器错误吗?对此有任何评论将不胜感激。

注意事项:

  • 我不简单地将方法 foo 声明为 void foo(A) 的原因是我实际上使用的是上部类型边界交集 (&)。
  • 我不在 foo() 中将 X 声明为类型变量的原因是我实际上在类级别遇到问题并且不想不必要地增加此类的类型参数的数量。

最佳答案

我检查了代码:

public class Test
{
public interface A<X> {
X get();
void doStuff(X x);
}
public <T extends A<?>> void foo(T t) {
bar(t);
}

private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
}

它有效。 javac 1.6.0_22。你哪里有错误?或者我使用其他代码?

关于java - 从类型绑定(bind)中使用的泛型类型访问类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185472/

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