Was ich will, ist folgende:Infer generische Klasse Typ Parameter von einzelnen Konstruktorparameter
Die meiste Zeit wird die generische Klasse wie TestBuilder<X, X>
sein, was bedeutet, dass T und O des gleichen Typs sind. Deshalb erstelle ich zwei verschiedene Konstruktoren. Ich möchte anonyme neue Anrufe wie new TestBuilder<>(...)
machen (ich rufe die <>
anonoumous hier).
folgenden 4 Konstruktor Beispiel existiert:
1) Arbeits Konstruktor ruft
// Anonoumous, working
new TestBuilder<>(String.class, Integer.class)
.withOnNext(new Action1<Integer>()
{
@Override
public void call(Integer integer)
{
}
});
// not anonoumous, classified, working
new TestBuilder<String, String>(String.class)
.withOnNext(new Action1<String>()
{
@Override
public void call(String string)
{
}
});
2) Konstruktoraufrufe mit Problemen oder arbeiten nicht
// Anonoumous and working
// PROBLEM: withOnNext is called with Object instead of String
new TestBuilder<>(String.class)
.withOnNext(new Action1<Object>()
{
@Override
public void call(Object o)
{
}
});
// Anonoumous and NOT working
// this is what I want to work!
new TestBuilder<>(String.class)
.withOnNext(new Action1<String>()
{
@Override
public void call(String string)
{
}
});
Frage
Gibt es eine Möglichkeit, den 4. Konstruktor zum Laufen zu bringen? Ich möchte nicht gezwungen werden, dem Konstruktor zwei Klassen zu geben, wenn ich es nur mit einem Argument anrufe, die zweite generische Klasse sollte in diesem Fall von der ersten "erben". Anstatt new TestBuilder<String, String>(String.class)
schreiben zu müssen, möchte ich schreiben new TestBuilder<>(String.class)
oder zumindest new TestBuilder<String>(String.class)
...
Klasse
Dies ist, was die Test-Builder-Klasse wie folgt aussieht:
public class TestBuilder<T, O>
{
public TestBuilder(Class<T> eventClass)
{
this(eventClass, (Class<O>)eventClass);
}
private TestBuilder(Class<T> eventClass, Class<O> observableClass)
{
init();
}
public TestBuilder<T, O> withOnNext(Action1<O> actionNext)
{
mActionNext = actionNext;
return this;
}
}
Klasse hat bestimmt/gegeben werden, oder es wird auf die 'Object' Typ Standard. Eine Abhilfe setzt in generischen Typen (Konstruktor 2) oder Gießen. Was ist schlimmer als Eingabe generische Typen. Eine Möglichkeit könnte auch der private Konstruktor sein. Obwohl das den Zweck dieses ganzen Mechanismus besiegen würde. –
n247s
verwenden Sie tatsächlich die '' 'Klasse <...>' '' Objekte, die Sie weitergeben? –
Die erste 'Klasse <...>' Objekt verwendet wird, die zweite ist für die generische Klasse Bestimmung nur ... – prom85