Вы также можете исправить эту проблему, используя аннотацию @Service в классе службы и передав требуемый bean classA в качестве параметра в другой конструктор класса bean bean и аннотировать конструктор класса B с @Autowired. Пример фрагмента здесь:
@Service
public class ClassB {
private ClassA classA;
@Autowired
public ClassB(ClassA classA) {
this.classA = classA;
}
public void useClassAObjectHere(){
classA.callMethodOnObjectA();
}
}
Спецификация ограничивает вывод параметра типа для общих методов ко всем или ничто. Вы не можете иметь частичный вывод.
Обоснование, вероятно, упрощает правила вывода типов (которые уже довольно сложны, так как они также должны учитывать правила перегрузки).
Я использовал решение Marc Gravell и вроде этого, но я могу представить другую альтернативу.
Поскольку общие параметры выводятся из параметров, другой вариант заключается в том, чтобы вместо этого использовать параметр out для результата возвращаемого значения.
Это возможно в течение длительного времени, но сегодняшний C # позволяет объявить переменную inline, которую я считаю полезным для использования.
public static void Cast<T1, T2>(this T1 arg, out T2 result) where T2 : class where T1 : class
{
result = arg as T2;
}
Вы можете назвать это следующим образом
objOfTypeT1.Cast(out Type2 objOfTypeT2);
Вывод не учитывает тип возврата; вы можете, однако, попытаться разделить дженерики; например, вы могли бы написать код, чтобы разрешить:
.Cast().To<Type2>()
, имея (непроверенный, только указательный)
public static CastHelper<T> Cast<T>(this T obj) {
return new CastHelper<T>(obj);
}
public struct CastHelper<TFrom> {
private readonly TFrom obj;
public CastHelper(TFrom obj) { this.obj = obj;}
public TTo To<TTo>() {
// your code here
}
}