# Traits in Julia?

**URL:** https://discourse.julialang.org/t/traits-in-julia/17267
**Category:** General Usage
**Tags:** traits
**Created:** [November 7, 2018, 4:52pm UTC](https://discourse.julialang.org/t/traits-in-julia/17267 "2018-11-07T16:52:03Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![peter.wolf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/peter.wolf/32/6018_2.png) [@peter.wolf](https://discourse.julialang.org/u/peter.wolf)
#### Post date: [November 7, 2018, 4:52pm UTC](https://discourse.julialang.org/t/traits-in-julia/17267/1 "2018-11-07T16:52:03Z")

</div>

Is there an idiomatic way to do user defined traits ala Scala or Rust, or interfaces ala Java?

I want to define ‘contracts’ so I know which functions are available for my arguments. Julia has predefined interfaces such as Iteration. How does one declare new ones?

Thanks  
P

---

<div class="post-metadata">

### Author: ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)
#### Post date: [November 7, 2018, 4:53pm UTC](https://discourse.julialang.org/t/traits-in-julia/17267/2 "2018-11-07T16:53:52Z")

</div>

> [@peter.wolf](#):
>
> Julia has predefined interfaces such as Iteration.

There is no first class “Iteration” concept in Julia—it’s just a convention with documentation. That’s the current approach to this sort of thing, similar to duck typing in other dynamic languages. We would like to add a first-class interface/protocol/concept entity at some point, but it was beyond the scope of the 1.0 release of the language.

---

<div class="post-metadata">

### Author: ![peter.wolf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/peter.wolf/32/6018_2.png) [@peter.wolf](https://discourse.julialang.org/u/peter.wolf)
#### Post date: [November 7, 2018, 5:13pm UTC](https://discourse.julialang.org/t/traits-in-julia/17267/3 "2018-11-07T17:13:52Z")

</div>

OK, thanks. I will ‘duck’ for now and look forward to some future release

---

<div class="post-metadata">

### Author: ![mauro3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mauro3/32/292_2.png) [@mauro3](https://discourse.julialang.org/u/mauro3)
#### Post date: [November 7, 2018, 5:19pm UTC](https://discourse.julialang.org/t/traits-in-julia/17267/4 "2018-11-07T17:19:59Z")

</div>

Also have a look at [Methods · The Julia Language](https://docs.julialang.org/en/v1/manual/methods/#Trait-based-dispatch-1)

---

<div class="post-metadata">

### Author: ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)
#### Post date: [November 7, 2018, 5:22pm UTC](https://discourse.julialang.org/t/traits-in-julia/17267/5 "2018-11-07T17:22:00Z")

</div>

You can define your own in the same way the “Iteration” or “AbstractArray” conventions are defined.  
Ie, with documentation and a host of methods that will work on any type with which it is defined.

mauro3 also created the [SimpleTraits.jl](https://github.com/mauro3/SimpleTraits.jl) library.
