gpt4 book ai didi

Java 泛型 - 不允许子类

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:10 25 4
gpt4 key购买 nike

我有一个关于泛型的问题。假设我有 3 个类“Foo”、“Bar”(它是 Foo 的子类)、一个类“Factory”和一个接口(interface)“TestInterface”。我想写一个通用方法,它只允许“直接”实现接口(interface)的对象,所以没有子类。这对我来说很难,因为 Java8 似乎比 Java7 更“聪明”。

举个例子:

public interface TestInterface<T extends TestInterface<T>> {

}

public class Foo implements TestInterface<Foo>{

}

public class Bar extends Foo {

}

public class Factory {

public static <T extends TestInterface<T>> T doSth(T arg) {
return arg;
}
}

好的,这些是我的类(class)。现在在 doSth(T arg)在这种情况下我想允许 Foo 对象,因为它是唯一“直接”实现接口(interface)的类。

显然这样的东西现在不会编译:

Bar b = Factory.doSth(new Bar());

因为 Bar 没有实现 TestInterface<Bar> .

好的,我现在的问题是,这一行将毫无问题地编译:

Foo f = Factory.doSth(new Bar());

即使通用参数是 T 并且 T 应该用它自己的类实现接口(interface)(抱歉,真的不知道怎么说,希望你明白我的意思),编译器接受“Bar”作为参数。

因此编译器必须表现得像“好吧 Bar 不适合,但也许父类(super class)会适合”。然后它“看到”它与 superlcass“Foo”一起工作。然后 Bar 将被视为 Foo,因为每个 Bar 都是某种 Foo 或类似的东西?至少我是这么想的。

好吧,如果我尝试用 Java7 编译该行,它会失败。所以看起来 Java8 在类型删除方面更聪明一些?!

在 Java8 中有没有什么方法不允许子类,这样就不会编译?:

Foo f = Factory.doSth(new Bar());

希望您理解我的问题,我很少用英语写作。

问候

最佳答案

为什么Foo f = Factory.doSth(new Bar());的原因在 Java 8 而不是 Java 7 中工作是因为 Java 8 具有更好的类型推断。在 Java 7 中,类型被推断为:

Foo f = Factory.<Bar>doSth(new Bar());

Bar没有实现 TestInterface<Bar> , 但它确实实现了 TestInterface<Foo>通过继承。 Java 8 的类型推断得到了提升,类型将被推断为:

Foo f = Factory.<Foo>doSth(new Bar());

请注意 Factory.<Foo>doSth()期望一个 Foo作为参数所以 new Bar()隐式转换为 Foo效果很好。

恐怕没有办法解决这个问题。您将始终能够将对象向上转换为其父类(super class)。你可以制作 Foo final , 但这不允许子类化 Foo完全。

关于Java 泛型 - 不允许子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29084617/

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