在Java中,String.valueOf(Object)和之间有什么区别Object.toString()吗?这些是否有特定的代码约定?
我在类中有一个方法,它具有通过使用泛型指定的返回类型.
public class SomeMain {
public static void main(String[] args) {
Foo<Integer> foo = new Foo<Integer>();
System.out.println(foo.getFoo()); // Works, prints out "Foo"
}
public static class Foo<E> {
public E getFoo() {
return (E) "Foo";
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用泛型返回类型,我假设上面示例中的返回值将评估为:
return (Integer) "Foo"; // Inconvertible types !!!
Run Code Online (Sandbox Code Playgroud)
而是String返回并正确打印.
如果我将调用更改为:我收到编译错误:
String fooString = foo.getFoo(); // Compile error, incompatible types found
System.out.println(fooString);
Run Code Online (Sandbox Code Playgroud)
我错过了什么来帮助我理解这里发生的事情以及为什么原始版本不会导致编译错误.
public class Box<T> {
private T t;
public Box(T t){
this.t = t;
}
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> b = new Box(new String("may be"));
System.out.println(b.get()); // successfully print out "may be"
System.out.println(b.get().getClass()); // error
}
}
Run Code Online (Sandbox Code Playgroud)
此代码给出了运行时错误:
exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
b.get()不触发运行时错误?更确切地说:为什么编译器只在第二个checkcast字节码中插入指令(导致异常)? get()
假设我有一个方法
@SuppressWarnings("unchecked")
public <T extends Number> T getNumber() {
try {
return (T)number;
} catch (ClassCastException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
假设number是一个实例Integer,调用类似的方法
Float f = getNumber();
Run Code Online (Sandbox Code Playgroud)
结果成了一个ClassCastException.
我知道(不知何故)这是因为类型擦除,但有人可以提供更深刻的解释为什么异常升级到赋值级别并且不能在方法内捕获?
注意:我确实有public <T extends Number> T getNumber(Class<T> classT)从classT检查类型的版本,但希望摆脱传递classT并停止想知道上述问题.