// 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 int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyError(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native void err() throws Exception;
    }
    private static final class proxyI implements Seq.Proxy, I {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyI(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native int rand();
    }
    private static final class proxyI1 implements Seq.Proxy, I1 {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyI1(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native void j();
    }
    private static final class proxyI2 implements Seq.Proxy, I2 {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyI2(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native void g();
    }
    private static final class proxyI3 implements Seq.Proxy, I3 {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyI3(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native I1 f();
    }
    private static final class proxyInterfaces implements Seq.Proxy, Interfaces_ {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyInterfaces(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native void someMethod();
    }
    private static final class proxyLargerI implements Seq.Proxy, LargerI {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyLargerI(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native void anotherFunc();
        public native int rand();
    }
    private static final class proxySameI implements Seq.Proxy, SameI {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxySameI(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native int rand();
    }
    private static final class proxyWithParam implements Seq.Proxy, WithParam {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyWithParam(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        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();
}
