2010-01-31 29 views
10
scala> import java.util.Properties 
import java.util.Properties 

scala> trait Foo extends Properties 
defined trait Foo 

scala> classOf[Foo] 
res0: java.lang.Class[Foo] = interface Foo 

scala> class FooP extends Foo 
defined class FooP 

scala> classOf[FooP] 
res1: java.lang.Class[FooP] = class FooP 

scala> classOf[Properties with Foo] 
<console>:7: error: class type required but java.util.Properties with Foo found 
     classOf[Properties with Foo] 
      ^

scala> new Properties with Foo 
res2: java.util.Properties with Foo = {} 

scala> res2.getClass 
res3: java.lang.Class[_] = class $anon$1 

Có cách nào để nhận lớp học 'Thuộc tính với Foo' mà không tạo một cá thể hoặc lớp học mới không?Scala: Làm thế nào để có được lớp học của thành phần mixin?

Trả lời

7

classOf[X] chỉ hoạt động nếu X tương ứng với lớp vật lý. T with U là một loại kết hợp và không tương ứng với một lớp.

Bạn có thể sử dụng Tệp kê khai để xác định xóa của loại. Loại xóa của T with UT.

scala> trait T 
defined trait T 

scala> trait U 
defined trait U 

scala> manifest[T with U] 
res10: Manifest[T with U] = T with U 

scala> manifest[T with U].erasure 
res11: java.lang.Class[_] = interface T 

Ở đây bạn có thể thấy rằng List[Int]List[_] có tẩy xoá cùng:

scala> classOf[List[_]] 
res13: java.lang.Class[List[_]] = class scala.collection.immutable.List 

scala> classOf[List[Int]] 
res14: java.lang.Class[List[Int]] = class scala.collection.immutable.List 

scala> classOf[List[Int]] == classOf[List[_]] 
res15: Boolean = true 
+0

nhưng (T mới bằng U) .getClass sẽ trả về một lớp. Vậy thì nó là gì? – IttayD

+3

'T mới với U' khai báo và khởi tạo một lớp ẩn danh thực hiện các giao diện' T' và 'U'. – retronym

1

Không thể thực hiện điều này vì "X với Y" là định nghĩa ẩn danh trong ví dụ của bạn. Đây không phải là trường hợp cho "class X mở rộng Z với Y" tất nhiên.

0

Bạn không thể có được một lớp đen nhưng bạn có thể kiểm tra nếu một đối tượng đáp ứng loại theo hai cách khác nhau:

trait X 
trait Y 

val xy: AnyRef = new X with Y 
val zz: AnyRef = new Object with X 

xy.isInstanceOf[X with Y] // true 
zz.isInstanceOf[X with Y] // false 

xy match { case a: X with Y => true; case _ => false} // true 
zz match { case a: X with Y => false; case _ => false} // false 

Nó rất giống khai chung này trong java

public <T extends Comparable<T> & Serializable> T id(T t) { return t; } 

Đó phương pháp được xoá hoàn toàn để

public Comparable id(Comparable t) { return t; } 

Tuy nhiên trong Java bạn có thể không nói xy instanceof (X&Y) nhưng nó thực sự giống như xy instanceof X && xy instanceof Y

0

Tôi không chắc chắn chính xác những gì bạn đang cố gắng để làm với composit lớp, nhưng những gì bạn có thể làm là lấy danh sách các giao diện được triển khai thực hiện và lớp cha của một lớp ẩn danh đã cho có thể đủ. Ví dụ:

trait X 
trait Y 
class Foo 
val bar = new Foo with X with Y 
val barClass = bar.getClass // class $anon$1 
barClass.getInterfaces // Array(interface X, interface Y) 
barClass.getSuperclass // class Foo 
+1

Điều tôi muốn là có được lớp bố cục mà không cần tạo một cá thể hoặc lớp mới – IttayD

Các vấn đề liên quan