Das Device nicht public ist aber als Parameter in addDevice verwendet wird ist richtig und es ist ganz normal und erwartet dass das so in Java funktioniert.
Das funktioniert da Device package Visibility hat und daher können alle Brick und Bricklet Klassen im com.tinkerforge Package davon erben. Die Brick und Bricklet Klassen selbst sind public und Objekte davon können daher an addDevice übergeben werden.
Aber es spricht nichts dagegen Device public zu machen. Allerdings kann man nur einen public Klasse pro .java Datei haben. Eine mögliche Lösung wäre die Device Klasse in eine Device.java auszulagern. Aber eigentlich wollen wir die IPConnection (und dazu gehört das Device) in einer Datei haben.
Was ich aber recht einfach tun kann ist die Device Klasse als innere Klasse in IPConnection Klasse zu machen, so dass sie über IPConnection.Device public verfügbar ist.