# RMI mit Generic Method



## Hellboy256 (20. Apr 2012)

Also ich hab zum test eine simple RMI Anwendung geschrieben die auch perfekt funktioniert hat. Jetzt hab ich zum Test eine zusaetzliche Generische Methode zum Server hinzugefuegt und jetzt krieg ich auf einmal eine ganze Reihen Fehlermeldungen:

```
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Operations extends Remote {
    <T> int TestGeneric(T op, T param1, T param2);
}
```


```
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
	
public class Server implements Operations {
	
    public Server() {}
	public <T> int TestGeneric(T op, T param1, T param2) {
		return 0;
	}
    
    public static void main(String args[]) {
		try {
		    Server server = new Server();
		    Operations stub = (Operations) UnicastRemoteObject.exportObject(server, 2200);
	
		    // Bind the stub of the remote object in the registry
		    Registry registry = LocateRegistry.getRegistry();
		    registry.bind("Test", stub);
	
		    System.out.println("Server ready");
		} catch (Exception e) {
		    System.out.println("Server error: " + e.toString());
		    e.printStackTrace();
		}
    }
}
```

Hier die Fehlermeldung:

```
java Server 
Server error: java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is: 
	java.lang.IllegalArgumentException: illegal remote method encountered: public abstract int Operations.TestGeneric(java.lang.Object,java.lang.Object,java.lang.Object)
java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is: 
	java.lang.IllegalArgumentException: illegal remote method encountered: public abstract int Operations.TestGeneric(java.lang.Object,java.lang.Object,java.lang.Object)
	at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:198)
	at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:310)
	at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:252)
	at Server.main(Server.java:18)
Caused by: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract int Operations.TestGeneric(java.lang.Object,java.lang.Object,java.lang.Object)
	at sun.rmi.server.Util.checkMethod(Util.java:262)
	at sun.rmi.server.Util.getRemoteInterfaces(Util.java:241)
	at sun.rmi.server.Util.getRemoteInterfaces(Util.java:211)
	at sun.rmi.server.Util.createProxy(Util.java:144)
	at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:196)
	... 3 more
```


----------



## irgendjemand (20. Apr 2012)

weil


```
<T> int
```

auch NICHT geht ... da "<T>" ja für "TYPE" steht ... wenn dann also so


```
public <T> testGeneric
```

das das überhaupt compiled wundert mich ...


----------



## SlaterB (20. Apr 2012)

also z.B. folgendes funktioniert und ergibt einigermaßen Sinn

```
public class Test {
    public static void main(final String[] args) {
        Plus p = new Plus();
        System.out.println(p.calc(4, 5));
    }
}

class Plus  implements Operation {
    public <T extends Number>int calc(T a, T b)  {
        return a.intValue() + b.intValue();
    }
}

interface Operation  extends Remote {
    <T extends Number>int calc(T a, T b);
}
```

vielleicht einfach auf Generics in Remote verzichten?
man kann ja Object als Parameter verwenden und im Client einen Wrapper mit generischen Aufbau drumherumschließen,
schön sicher nicht..,
im Internet zu Generics bei RMI keine Beispiele zu finden? habe selber auch nur ganz kurz geschaut


----------



## fastjack (20. Apr 2012)

Natürlich geht das


```
public <T> int TestGeneric(T op, T param1, T param2)
```

T definiert nur den Typ von op, param1 und param2. Warum soll das denn nicht gehen?


----------



## irgendjemand (20. Apr 2012)

weil <T> in diesem fall der return-type wäre ?


----------



## Hellboy256 (20. Apr 2012)

Der return Type ist doch 
	
	
	
	





```
int
```
Leider wuerd ich gern Generische Parameter uebergeben, aber ich werde aus der Exception einfach nicht schlau...


----------



## Joew0815 (22. Apr 2012)

versuch mal


```
import java.rmi.Remote;
import java.rmi.RemoteException;
 
public interface Operations extends Remote {
    <T> int TestGeneric(T op, T param1, T param2) throws RemoteException;
}
```


----------



## fastjack (23. Apr 2012)

irgendjemand hat gesagt.:
			
		

> weil <T> in diesem Fall der return-type wäre ?



T ist der Typ der innerhalb dieser Methode benutzt wird, nicht der return type. Das ganze nennt sich "Generic Method".


----------

