Java 泛型与接口继承的结合

发布于 2024-12-07 12:40:04 字数 654 浏览 0 评论 0原文

我对 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 有一个 T = Type0 的默认值?

I have a problem with generics in Java in combination with interface inheritance.
Here is an exampe:

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

Now, when I try to use field of type SomeInterface1 without type parameter java comiler treats type of SomeInterface1.get() method result as Type0. And can't compile something like this:

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

So, why SomeInterface1<T extends Type1> has a default vlue for T = Type0 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

隱形的亼 2024-12-14 12:40:04

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

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

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

When leaving out generic parameters, almost all of the generics logic is skipped. Determining the type of T will not be 'smart' and just look at the way T is defined within that class/interface.

If you want to use the generics logic, you should provide generic parameters instead of leaving them out - they can still be very, well, 'generic':

SomeInterface2<? extends Type1> si1;
si1.get().method();
抹茶夏天i‖ 2024-12-14 12:40:04

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

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

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

Since you're not using a type parameter when declaring the object of type SomeInteface1, the java compiler has no idea what actual class/interface it'll return when you invoke get(). The only thing that's certain is that it's an interface that extends Type0 (given the declaration of SomeInterface0).

When you call get(), the compiler is checking the signature of the interface where get() is declared, so the only methods it knows can be called (without explicit type parameter being given), are the methods declared in Type0.

Let me know if I was too confusing, I'll try to clear up the answer! :P

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文