- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在研究泛型时注意到了一些事情。在下面的示例中,doStuff1
编译但 doStuff2
不编译:
public <T extends Foo> void doStuff1(T value) {
Class<? extends Foo> theClass = value.getClass();
}
public <T extends Foo> void doStuff2(T value) {
Class<? extends T> theClass = value.getClass();
}
所以,我查阅了 Object.getClass()
的文档,发现了这个:
The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.
这让我有点好奇。为什么getClass()
要这样设计?如果适用,我可以理解将类型转换为其原始类,但我看不出有什么明显的理由说明为什么他们必须让它也杀死 T
。是否有特定的原因为什么它也摆脱了它,或者它只是一种普遍的“让我们摆脱一切,因为它更容易;反正谁会需要它”的方法?
最佳答案
如果getClass()
返回 Class<? extends X>
,不会发生任何真正糟糕的事情;实际上它会帮助很多用例。
唯一的问题是,它在理论上是不正确的。如果对象是 ArrayList<String>
, 它的 class
不能是 Class<ArrayList<String>>
- 没有这样的类,只有一个 Class<ArrayList>
.
这其实和删除无关。如果有一天 Java 获得完整的具体化类型,getClass()
仍应返回 Class<? extends |X|>
;然而应该有一个新的方法,比如getType()
可以返回更详细的 Type<? extends X>
. (不过,getType
可能会与许多现有的具有自己的 getType
方法的类发生冲突)
目前,自 Class<? extends X>
在很多情况下可能会有用,我们可以设计自己的方法来做到这一点
static <X> Class<? extends X> myGetClass(X x){ ... }
但他们不会将这种 hack 放入标准库中是可以理解的。
关于Java:有界类型的 getClass(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18144556/
为什么这在 Java 中可行: this.getClass().getClass().getClass().getClass()... 为什么会出现这种无限递归? 只是好奇。 最佳答案 这里没有无限递
我正在测试Object是否等于特定的class类型。例如: @Override public void itemStateChanged(ItemEvent e) { if (e.getSta
详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开
Blockquote public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == nul
我正在尝试比较两个相同的对象。当页面第一次加载时,它们是相等的,但是当我第二次刷新页面时,尽管数据或对象没有改变,但它们并不相等。 我在做什么。 我有一个 CurrentUser obj,我在登录时将
我的 MyClass 类中有 equals() 的 @Override: @Entity( name = "MyClass" ) @Table( name = "my_class" ) public
我在这里真的是指身份平等。 例如,以下是否总是打印 true? System.out.println("foo".getClass() == "fum".getClass()); 最佳答案 是的,类标
getClass().getClassLoader().getResource()和getClass.getResource()有什么区别? 从资源中检索文件时,在什么情况下应该使用哪一个? 最佳答案
这个问题已经有答案了: Different ways of loading a file as an InputStream (6 个回答) 已关闭 5 年前。 我正在浏览 ImageIO,并且在网络
有没有办法创建另一个对象类型的新对象? 示例: Soldier extends Person Accountant extends Person Person 的每个子类都有一个接受(出生日期和死亡日
FXMLLoader类的 load()方法用于加载FXML文件。那么 getClass().getResource() 是在做什么 Parent root = FXMLLoader.load(getC
考虑这段代码: class A { static int i=3; } public class TT extends A { public static void main(Stri
为什么第一行有效而第二行无效: Class c1 = (new Object()).getClass().getClass(); Class> c2 = (new O
我见过类似的问题并且有一个可行的解决方案,但我没有深入理解为什么我的示例中的前四次尝试(c1、c2、c3 和 c4)无法编译。归结为我不理解 this.getClass() 返回的编译时类是什么。 i
这个 Actor 安全吗? private void foo(T value) { final Class aClass = (Class) value.getClass(); } 是否存在
我在学习 Java 时遇到了一件奇怪的事情。考虑以下程序: public class GetClassNameInheritance { public static void main(Str
我编写了以下代码: public class AnonymousClasses { public void sayHello(){ } public interface Greetin
我正在尝试创建其中包含文本字段的对话框。代码如下 private void showBatchDialog() { Dialog dialog = new Dialog(); dial
我正在尝试使用 getClass() 方法并具有以下代码: class parent{} class child extends parent{} public class test { pu
在 Java 中,我想为方法编写测试(简化片段): public class MyClass { private static final Set SOME_SET = new HashSet
我是一名优秀的程序员,十分优秀!