Ho un interfaccia che si presenta sostanzialmente in questo modo:Come rendere questo Java 7 compatibile?
public interface ISetting<T> {
public T getDefault();
public T value();
public void set(T value);
public String getName();
public default String getValueName() {
Object obj = value();
if (obj instanceof Boolean) {
return (boolean)obj ? "Yes" : "No";
}
return obj.toString();
}
}
E poi in un'altra classe ho un elenco di ISetting<?>
private List<ISetting<?>> settings = Arrays.asList(
new ClassMode(),
new EndMode(),
new PlayerLives(),
new JoinMidGame(),
new ScoreboardDisplay(),
new LifePerKill(),
new ExplosiveBullets(),
new ReloadTime());
E questo tutto funziona perfettamente! Tuttavia, la piattaforma in cui utilizzo il mio codice non supporta Java 8, quindi devo usare Java 7, ed ecco dove arrivano i problemi.
se ho impostato il target a 1,7 Maven, come questo nel mio pom.xml:
<configuration>
<source>1.8</source>
<target>1.7</target>
</configuration>
Quindi il codice compila perfettamente senza errori o altro. Tuttavia, quando si tenta di eseguire il codice, mi dà questo errore:
java.lang.ClassFormatError: Method getValueName in class net/uniqraft/murder/match/settings/ISetting has illegal modifiers: 0x1
ho cercato su Google, ma non ho trovato nulla che ho capito o sembrava di essere applicabile nel mio caso.
Così, ho pensato, mi rifarò l'intero codebase in Java 7:
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
Il primo errore che vedo è:
Default methods are allowed only at source level 1.8 or above
che è incredibilmente fastidioso e io non so come bypassarlo. Gran parte del mio codice dipende dalle implementazioni predefinite. Suppongo che dovrei semplicemente usare le classi astratte, invece?
Ma l'errore più problematico quello che vedo è il List<Setting<?>>
ho:
Type mismatch: cannot convert from List<ISetting<? extends Object&Comparable<?>&Serializable>> to List<ISetting<?>>
Non ho idea di che cosa ciò significhi o come risolvere il problema. Le offerte rapide di Eclipse non sono di aiuto.
Nel caso in cui l'avete bisogno di vedere l'intera classe non-spogliato ISetting o stacktrace piena, li ho messi esternamente come sono piuttosto Spacey:
Maven non dovrebbe consentire questa combinazione di origine/destinazione; il compilatore java non lo accetterà, quindi Maven potrebbe bloccare silenziosamente le impostazioni per il targeting di -target 1.8? Penso che tu ti stia addormentando in un falso senso di confidenza da parte di Maven, non venendo a mancare immediatamente alla compilazione. –
Ma la risposta breve è: i metodi predefiniti sono una funzionalità di Java 8 e richiedono il supporto dalla VM di Java 8. –