当前位置: 首页 > 面试题库 >

为什么班级比班级优先

罗渝
2023-03-14
问题内容

如果我将Class声明为字段:

Class fooClass;

Eclipse给我警告:

类是原始类型。对泛型类型Class的引用应参数化

在实践中这意味着什么?我为什么要这样做呢?如果我要求Eclipse提供“快速修复”,它将给我:

Class<?> fooClass;

这似乎并没有增加太多价值,但不再发出警告。

编辑:为什么类通用?您能否举一个参数化的例子,即可以有效使用除以外的东西<?>吗?

编辑:哇!我还没有意识到这一点。我也看过Java拼图游戏,这肯定使我害怕熊陷阱。所以我会一直使用

Class<MyString> myStringClass = MyString.class;

而不是

Class myStringClass = MyString.class;

(但是从第一天开始使用Java以来​​,我并没有真正注意到Class何时成为泛型)。

注意:我已经接受@oxbow_lakes,因为这对我来说很有意义,但这显然是一个非常复杂的领域。我敦促所有程序员使用特定的Class<MyString>而不是Class。并且Class<?>比更加安全Class


问题答案:

原始类型和无限制通配符

以前的答案都没有真正解决,为什么你应该更喜欢Class<?>Class,因为在它的面前,前者似乎提供不超过后者的更多信息。

原因是 原始类型 (即Class)阻止编译器进行泛型类型检查。也就是说,如果你使用原始类型, 颠覆 了类型系统。例如:

public void foo(Class<String> c) { System.out.println(c); }

可以这样调用(它将同时编译 运行):

Class r = Integer.class
foo(r); //THIS IS OK (BUT SHOULDN'T BE)

但不是通过:

Class<?> w = Integer.class
foo(w); //WILL NOT COMPILE (RIGHTLY SO!)

通过始终使用非原始格式,即使在?由于不知道类型参数是什么(或受其限制)而必须使用时,也可以让编译器比使用原始类型来更充分地推理程序的正确性。

为什么根本没有原始类型?

在Java语言规范说:

仅允许使用原始类型作为对遗留代码兼容性的一种让步

您应该始终避免使用它们。无界通配符?可能在其他地方得到最好的描述,但是从本质上讲意味着
“这是在某种类型上参数化的,但是我不知道(或不在乎)它是什么” 。这与 原始类型不同原始类型 是可憎的,并且在其他具有泛型的语言(例如
Scala)中
不存在。

为什么要对类进行参数化?

好吧,这是一个用例。假设我有一些服务接口:

public interface FooService

我想使用系统属性来定义要使用的类,以注入其实现。

Class<?> c = Class.forName(System.getProperty("foo.service"));

我现在不知道我的班级是正确的 类型

//next line throws ClassCastException if c is not of a compatible type
Class<? extends FooService> f = c.asSubclass(FooService.class);

现在我可以实例化一个FooService

FooService s = f.newInstance(); //no cast


 类似资料:
  • 问题内容: 我目前正在将H2O用于分类问题数据集。我正在python 3.6环境中对其进行测试。我注意到预测方法的结果是给出0到1之间的值(我假设这是概率)。 在我的数据集中,目标属性是数字,即值是1且值是0。我确保将类型转换为目标属性的类别,但仍得到相同的结果。 然后我修改了代码,仍然使用H2OFrame上的方法将目标列转换为因数,结果没有任何变化。 但是,当我分别将target属性中的值分别更

  • 问题内容: 我正在阅读[Java编程语言》一书。在解释 覆盖 方法的章节中,它说: 使覆盖方法(在子类中)比在超类中更不易于访问将违反超类的约定…… 整个文本是可以理解的。我唯一的问题是什么是 超类合同 ? 合同 对 Java 类意味着什么? 问题答案: Java类中的合同类似于现实世界中的合同-在非技术方面: 同意该类将公开某些方法,某些属性和某些行为。 更多技术,从这里开始:(我加粗了) 如果

  • 问题内容: 什么时候使用,最好使用vs ? 最好使用html上的说字体变体或元素吗?然后用于结构/容器吗? 这一直是我一直不确定的事情,任何帮助都会很棒。 问题答案: 使用识别元素只会出现在页面上的单个实例。例如,如果您将单个导航栏放置在特定位置,请使用。 用于对所有以某种特定方式表现的元素进行分组。例如,如果您希望公司名称在正文中以粗体显示,则可以使用。

  • 问题内容: 您好,我正在编写一个Android应用程序,并且已经设置了Proguard来混淆我的应用程序。但是,我使用类加载器为应用程序动态加载了不同的扩展。问题在于,如果更改了它们的名称,它们将无法正确加载。如何防止Proguard混淆特定的类名? 问题答案: 使用proguard.cfg中的选项 请参阅手册 https://www.guardsquare.com/en/proguard/man

  • 问题内容: 我试过重新安装netbeans,试过重新安装java。我不确定发生了什么,但是我从每个类中都随机得到此异常,直到重新启动netbeans。有类似问题的人吗? 跑: 问题答案: 有时,NetBeans本地缓存目录会损坏(由于应用程序更早崩溃或发生其他/未定义的情况)。NetBeans开始表现异常。重新安装没有帮助,因为本地缓存目录并不总是被删除。 如果您100%确定您的应用程序没有路径问

  • 问题内容: 是否可以使第n个子级伪选择器与特定类一起使用? 我想让第二个DIV.red变成红色,但是它没有应用预期的颜色。 不仅如此,当您指定它时,它会将第5个DIV更改为红色: 指定此选项后,它将第8个DIV更改为红色: 它似乎落后了一个DIV。该示例中只有8个DIV标签,所以我不知道为什么nth-child(9)甚至可以工作。使用Firefox 3.6进行测试,但在我的实际生产代码中,Chro