Matthew Layton
Matthew Layton

Reputation: 42229

Generic Constraint of Multiple Types

In Kotlin I can create a generic constraint of type T; for example:

interface Foo {
  val a: String
}

class Baz<T : Foo>(x: T) {
  init {
    println(x.a)
  }
}

What I want is a generic constraint where T extends or implements multiple types.

The equivalent in TypeScript would be to use an intersection type; for example:

interface Foo {
  a: string;
}

interface Bar {
  b: number;
}

class Baz<T extends Foo & Bar> {
  constructor(x: T) {
    console.log(x.a);
    console.log(x.b);
  }
}

The equivalent in C# would be to use a generic constraint of IFoo and IBar; for example:

public interface IFoo
{
  string A { get; }
}

public interface IBar
{
  string B { get; }
}

public class Baz<T> where T : IFoo, IBar
{
  public Baz(T x)
  {
    Console.WriteLine(x.A);
    Console.WriteLine(x.B);
  }
}

Does Kotlin support an equivalent to this?

Upvotes: 4

Views: 1040

Answers (1)

IR42
IR42

Reputation: 9672

class Baz<T>(x: T) where T : Foo, T : Bar {
    init {
        println(x.a)
        println(x.b)
    }
}

Upvotes: 7

Related Questions