scala - Method return type covariance -


how can define method returns list[+anyref]? tried:

def a[t <: anyref](): list[t] = list[anyref]()  

but reason not compile.

edit: according wong should use

def a[t <: anyref](): list[t] = list[t]() 

but there way able return subtype of anyref, example

def a[t <: anyref](): list[t] = if (value) list[t]() else list[option[string]]() 

here option[string] descendant of anyref, compiler not accept it

so main question if can declare method covariant return type list[+anyref]

let's make couple observations , experiment few ways of letting compiler decide on return type:

1) notice statement if (value) list[t]() else list[option[string]]() returns 2 different specific types if statement must return same type , else clauses. when statement returns value, compiler need infer general type 2 clauses bring in consistent constraint.

2) notice type variable t dependent on exact type pass in when call a(), example a[scala.io.source](). in method declaration gave t upper bound t <: anyref, means compiler has find general type union of type subtype of anyref , option[string].

3) notice return type inferred compiler removing return type declaration. i.e. def a[t <: anyref]() = if (true) list[t]() else list[option[t]](). compiler gave a() return type list[anyref]. sort of make sense because possibility general type between t subtype of anyref , option[of t].

4) try def a[t <: anyref]() = if (true) list[t]() else list[option[string]](). return type inferred list[java.lang.object]. reason string class in scala 2.8 java.lang.string, according best guess, general type has escape scala.* hierarchy , end in java.lang.object unknown reasons.

5) since anyref alias of java.lang.object, can def a[t <: anyref](): list[anyref] = if (true) list[t]() else list[option[string]]() force return type of list[anyref].

if want return subtype of anyref, have this:

def a(): list[anyref] = ... 

which returns super class, , have cast returned list[anyref] down using .asinstanceof[t]. alternatively:

def a[t <: anyref](): list[t] = list[t]() 

will gives specific type t, can't return 2 different types in if statement in example, 1 may more specific , other, , expect return more specific type supplied when call method. because compiler has no way guarantee type in if statement list[t] doing type checking. did make clearer?


Comments

Popular posts from this blog

python - Scipy curvefit RuntimeError:Optimal parameters not found: Number of calls to function has reached maxfev = 1000 -

c# - How to add a new treeview at the selected node? -

java - netbeans "Please wait - classpath scanning in progress..." -