I have the following simple Java code:
package testj; import java.util.*; public class Query<T> { private static List<Object> l = Arrays.<Object>asList(1, "Hello", 3.0); private final Class<? extends T> clazz; public static Query<Object> newQuery() { return new Query<Object>(Object.class); } public Query(Class<? extends T> clazz) { this.clazz = clazz; } public <S extends T> Query<S> refine(Class<? extends S> clazz) { return new Query<S>(clazz); } public List<T> run() { List<T> r = new LinkedList<T>(); for (Object o : l) { if (clazz.isInstance(o)) r.add(clazz.cast(o)); } return r; } }
I can call this from Java as follows:
Query<String> sq = Query.newQuery().refine(String.class);
But if I try to do the same from Scala:
val sq = Query.newQuery().refine(classOf[String])
I get the following error:
error: type of mismatch
found: lang.this.class [scala.this.Predef.String]
required: lang.this.class [? 0] forSome {type? 0 <:? }
val sq = Query.newQuery (). specify (classOf [String])
This is only fixed by entering the correct type parameter!
val sq = Query.newQuery().refine[String](classOf[String])
Why can't scala do this from my argument? Note. I am using Scala 2.7
source share