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

标签 java generics

不,这个问题不是关于 ?和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/

相关文章:

java - Java中的可扩展双链树实现

java - 线程执行期间(/之后)数据的可见性

java - Ant 在内存不足时调用 taskkill

java - 类似泛型的局部变量

c# - 使用反射从类列表的属性中获取值

java - 使用类作为类型参数,该类可能包含也可能不包含其他类型参数

java - 如何从字符串时间中减去 7 小时?

java - Lombok - 在实现 equals 和 hashcode 时使用 @Data 发出警告

java - JTable 排序和过滤

generics - Rust 期望生成器有两个级别的装箱,而我只指定了一个