2013-05-07 73 views
4

鑑於這些Java類定義:爲什麼來自Java的(T)this`不能在scala中工作?

class Base { 
    int value; 

    public <T extends Base> T self() { 
     return (T) this; 
    } 

} 

class Derived extends Base {} 

這個Java代碼編譯罰款:

new Derived().self(); 

但Scala代碼無法運行:

(new Derived).self(); // runtime error 

Rumtime錯誤:

java.lang.ClassCastException: Derived cannot be cast to scala.runtime.Nothing$ 

爲什麼它不起作用,以及如何解決它?

回答

4

在scala中,這個方法看起來像self[T <: Base](): T。在(new Derived).self()中,您沒有指定T。這意味着最具體的類型 - Nothing

所以(new Derived).self()實際上是(new Derived).self[Nothing]()

您可以試試(new Derived).self[Derived]()val d: Derived = (new Derived).self()

0

我想你寫錯了代碼。我在JDK 1.6中進行了測試。

new Derived().self(); 
(new Derived()).self(); 

都沒問題。

(new Derived).self();給出編譯錯誤!

+0

'(new Derived).self()'在問題中是scala代碼。 – Freewind 2013-05-12 14:08:57

相關問題