« Return to Thread: [scala] Constructor parameters for traits

Re: [scala] Constructor parameters for traits

by Andrew McCallum :: Rate this Message:

Reply to Author | View in Thread

I'm desperate for trait constructor arguments only because I need a Manifest for my trait's type argument (in order to include code whose behavior depends on the type). Something like:

trait Farm[A <: Animal](implicit m:Manifest[A]) {
  def foo(a:Animal) = if (m.erasure == a.getClass) bar1 else bar2
}

Is there some other recommended work-around?  Of course my true use-case is a bit more complicated.  I'm stuck without a solution.

-Andrew


Andrés Testi wrote:
But my example is yet valid. The compiler refuses my code because msg
in Sub1 was overriding msg in Sub2. Why not apply the same compiler
restrictions on trait constructors?

- Andrés

2008/12/2 Andrés Testi <andres.a.testi@gmail.com>:
> Oh, sorry, my code doesn't really works :-(
>
> 2008/12/2 Andrés Testi <andres.a.testi@gmail.com>:
>> But what about this?:
>>
>> trait Base{ val msg: String }
>> trait Sub1 extends Base{ override val msg = "hello" }
>> trait Sub2 extends Base{ override val msg = "goodbye" }
>> Object Test extends Sub1 with Sub2
>>
>> The above code works fine. Why not apply the same rules to solve
>> diamond inheritance?
>>
>> - Andrés
>>
>> 2008/12/2 James Iry <jamesiry@gmail.com>:
>>> Diamond inheritance creates extra complexity.  Here's one example
>>>
>>> trait Base(val msg : String}
>>> trait Sub1 extends Base("hello")
>>> trait Sub2 extends Base("goodbye")
>>> Object Test extends Sub1 with Sub2
>>> println(Test.msg) // hello?  goodbye? error?
>>>
>>> There are ways for a language to let you resolve diamond inheritance.  But
>>> it does complicate things.
>>>
>>> On Tue, Dec 2, 2008 at 9:17 AM, Sebastien Braun <sebb@yellowhippy.org>
>>> wrote:
>>>>
>>>> Hello, List.
>>>>
>>>> I know that traits can not have constructor parameters, however I have not
>>>> been able to find out much about the rationale behind this restriction; my
>>>> google-fu fails me and the SLS is quiet on it (or, maybe, I just don't
>>>> know
>>>> where to look for it).
>>>>
>>>> For this scala code
>>>>
>>>> > trait A {
>>>> >   System.out.println("Hello, World!")
>>>> > }
>>>> >
>>>> > class AImpl extends A
>>>>
>>>> scalac will generate (something closely resembling) the following
>>>> pseudo-Java:
>>>>
>>>> > public interface A {}
>>>> >
>>>> > public class A$class {
>>>> >       public static void $init$(A $this) {
>>>> >               System.out.println("Hello, World!");
>>>> >       }
>>>> > }
>>>> >
>>>> > public class AImpl implements A {
>>>> >       public A() {
>>>> >               A$class.$init$(this);
>>>> >       }
>>>> > }
>>>>
>>>> So, intuitively (and perhaps naïvely...), it seems to me that the compiler
>>>> should also be able to accept constructor parameters for traits:
>>>>
>>>> > trait A(message: String) {
>>>> >       System.out.println(message)
>>>> > }
>>>>
>>>> and just tack on the arguments to the $init$ method of the trait's
>>>> implementation class:
>>>>
>>>> > public interface A {}
>>>> >
>>>> > public class A$class {
>>>> >       public static void $init$(A $this, String message) {
>>>> >               System.out.println(message);
>>>> >       }
>>>> > }
>>>>
>>>> Is this a bad idea?
>>>>
>>>> Cheers,
>>>>
>>>> Sébastien
>>>
>>>
>>
>

 « Return to Thread: [scala] Constructor parameters for traits