// 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.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 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();
}
