gpt4 book ai didi

java - 泛型:如何捕获通配符?

转载 作者:行者123 更新时间:2023-11-29 05:02:54 24 4
gpt4 key购买 nike

不,这个问题不是关于 ?和T;这是关于我如何转动 < ? > 参数转换为命名的 < T >。考虑这个示例代码:

import java.io.Serializable;

class A<T extends Serializable> {
<S extends Serializable> void bar(S arg) { }
void bar2(T arg) { }
}

public class B {
A<? extends Serializable> myA = null;
<T extends Serializable> void foo(T arg) {
myA.bar(arg);
myA.bar2(arg);
}
}

我的问题是上面没有编译;调用 bar2() 给了我

The method bar2(capture#2-of ? extends Serializable) in the type
A<capture#2-of ? extends Serializable> is not applicable for the arguments (T)

我猜“原因”是 myA 是 < ?扩展序列化 >;但是 B.foo 中的 T ... 很好,一个命名为 T;而不是通配符 ?。

“解决”这个问题的一种方法是使 成为类 B 的类型参数……但这基本上与我对该类的其他用法有冲突。意思是:我最终像这样写下 B 及其成员 myA - 正是因为我不想参数化 B 类。所以,我只从 bar2() 方法开始;然后在后面添加了 bar() ……但这也无济于事。

那么 - 有没有办法让我的 B 类在我的示例代码中按“预期”使用 A.bar2()?

编辑:准确地说 - bar() 方法对我没有帮助;因为那里的“S”……与我在 A 类中真正使用的“T”不兼容。

最佳答案

你进了死胡同。

A<? extends Serializable> myA = ...;

所以 myAA未知的东西。它可能是 A<String> , 或 A<Integer>A<Banana> .你只是不知道。假设它是一个 A<Banana> .

<T extends Serializable> void foo(T arg) {

所以 foo()接受任何可序列化的:String、Integer、Banana、Apple 等等。假设它是用 Integer 调用的作为参数。

myA.bar2(arg);

因此,根据上述假设,这将调用 bar2()以整数作为参数,尽管 myAA<Banana> .这不能被编译器接受:它显然不是类型安全的。 B必须通用。

关于java - 泛型:如何捕获通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31454564/

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