如果我将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