相关疑难解决方法(0)

String.valueOf()与Object.toString()

在Java中,String.valueOf(Object)和之间有什么区别Object.toString()吗?这些是否有特定的代码约定?

java string

117
推荐指数
4
解决办法
7万
查看次数

为什么使用泛型不会抛出运行时或编译时异常?

我在类中有一个方法,它具有通过使用泛型指定的返回类型.

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)

我错过了什么来帮助我理解这里发生的事情以及为什么原始版本不会导致编译错误.

java generics

16
推荐指数
1
解决办法
596
查看次数

分配给泛型类型的Java原始类型值运行时getClss()方法错误

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)
  1. 为什么b.get()不触发运行时错误?
  2. 为什么只有在我尝试获取类变量的类时才会发生运行时错误?

更确切地说:为什么编译器第二个checkcast字节码中插入指令(导致异常)? get()

java generics casting runtime

5
推荐指数
1
解决办法
349
查看次数

在进行通用转换时,在泛型方法中捕获ClassCastException

假设我有一个方法

@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并停止想知道上述问题.

java generics casting type-erasure classcastexception

2
推荐指数
1
解决办法
542
查看次数