【问题标题】:Java Generics in combination with interface inheritanceJava 泛型与接口继承的结合
【发布时间】:2011-10-02 15:26:20
【问题描述】:

Java 中的泛型与接口继承相结合存在问题。 这是一个例子:

public interface Type0 { }

public interface Type1 extends Type0 {
    void method();
}

public interface SomeInterface0<T extends Type0> {
   T get();
}

public interface SomeInterface1<T extends Type1> extends SomeInterface0<T> { }

现在,当我尝试使用不带类型参数的SomeInterface1 类型的字段时,java 编译器将SomeInterface1.get() 方法结果的类型视为Type0。并且不能编译这样的东西:

...
SomeInterface1 si1;
...
si1.get().method();

那么,为什么SomeInterface1&lt;T extends Type1&gt;T = Type0 的默认值?

【问题讨论】:

    标签: java generics inheritance interface


    【解决方案1】:

    当省略泛型参数时,几乎所有的泛型逻辑都会被跳过。确定 T 的类型并不“聪明”,只需查看在该类/接口中定义 T 的方式即可。

    如果你想使用泛型逻辑,你应该提供泛型参数而不是忽略它们——它们仍然可以是非常“泛型”:

    SomeInterface2<? extends Type1> si1;
    si1.get().method();
    

    【讨论】:

      【解决方案2】:

      由于您在声明 SomeInteface1 类型的对象时没有使用类型参数,因此 java 编译器不知道在您调用 get() 时它将返回什么实际的类/接口。唯一可以确定的是,它是一个扩展 Type0 的接口(鉴于 SomeInterface0 的声明)。

      当您调用 get() 时,编译器正在检查声明 get() 的接口的签名,因此 知道的唯一方法可以被调用(没有给出显式类型参数) , 是 Type0 中声明的方法。

      如果我太困惑了,请告诉我,我会尽力澄清答案! :P

      【讨论】:

      • 谢谢,我知道了! ))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 2014-03-05
      相关资源
      最近更新 更多