// Java class interfaces.Error is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

public interface Error {
    public void err() throws Exception;
    
}

// Java class interfaces.I is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

public interface I {
    public int rand();
    
}

// Java class interfaces.I1 is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

/**
 * not implementable
 */
public interface I1 {
    public void j();
    
}

// Java class interfaces.I2 is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

/**
 * not implementable
 */
public interface I2 {
    public void g();
    
}

// Java class interfaces.I3 is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

/**
 * implementable
(the implementor has to find a source of I1s)
 */
public interface I3 {
    public I1 f();
    
}

// Java class interfaces.Interfaces_ is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

/**
 * Interfaces is an interface with the same name as its package.
 */
public interface Interfaces_ {
    public void someMethod();
    
}

// Java class interfaces.LargerI is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

public interface LargerI extends I, SameI {
    public void anotherFunc();
    public int rand();
    
}

// Java class interfaces.SameI is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

public interface SameI {
    public int rand();
    
}

// Java class interfaces.WithParam is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

public interface WithParam {
    public void hasParam(boolean p0);
    
}

// Java class interfaces.Interfaces is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package interfaces;

import go.Seq;

public abstract class Interfaces {
    static {
        Seq.touch(); // for loading the native library
        _init();
    }
    
    private Interfaces() {} // uninstantiable
    
    // touch is called from other bound packages to initialize this package
    public static void touch() {}
    
    private static native void _init();
    
    private static final class proxyError implements Seq.Proxy, Error {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyError(Seq.Ref ref) { this.ref = ref; }
        
        public native void err() throws Exception;
    }
    private static final class proxyI implements Seq.Proxy, I {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyI(Seq.Ref ref) { this.ref = ref; }
        
        public native int rand();
    }
    private static final class proxyI1 implements Seq.Proxy, I1 {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyI1(Seq.Ref ref) { this.ref = ref; }
        
        public native void j();
    }
    private static final class proxyI2 implements Seq.Proxy, I2 {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyI2(Seq.Ref ref) { this.ref = ref; }
        
        public native void g();
    }
    private static final class proxyI3 implements Seq.Proxy, I3 {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyI3(Seq.Ref ref) { this.ref = ref; }
        
        public native I1 f();
    }
    private static final class proxyInterfaces implements Seq.Proxy, Interfaces_ {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyInterfaces(Seq.Ref ref) { this.ref = ref; }
        
        public native void someMethod();
    }
    private static final class proxyLargerI implements Seq.Proxy, LargerI {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyLargerI(Seq.Ref ref) { this.ref = ref; }
        
        public native void anotherFunc();
        public native int rand();
    }
    private static final class proxySameI implements Seq.Proxy, SameI {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxySameI(Seq.Ref ref) { this.ref = ref; }
        
        public native int rand();
    }
    private static final class proxyWithParam implements Seq.Proxy, WithParam {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyWithParam(Seq.Ref ref) { this.ref = ref; }
        
        public native void hasParam(boolean p0);
    }
    
    
    public static native int add3(I r);
    public static native void callErr(Error e) throws Exception;
    public static native I seven();
}
