Вы можете изменить свой метод, как показано ниже, приведя к T.
public <T extends Root> T gets(int type) {
switch (type) {
case 1:
return (T) new A();
case 2:
return (T) new B();
default:
throw new RuntimeException();
}
}
При ловле исключения, можно создать объект StackTrace и извлечь полезную информацию из него. Посмотрите следующий пример:
StackTrace st = new StackTrace(true);
for(int i =0; i< st.FrameCount; i++ )
{
// Note that high up the call stack, there is only
// one stack frame.
StackFrame sf = st.GetFrame(i);
Console.WriteLine();
Console.WriteLine("High up the call stack, Method: {0}",
sf.GetMethod());
Console.WriteLine("High up the call stack, Line Number: {0}",
sf.GetFileLineNumber());
}
PS: Это работает даже без исключения - видят, Как распечатать текущее отслеживание стека в.NET без любого исключения.
Система. Среда. StackTrace является потрясающим инструментом, но знать, что Вы не всегда получаете то, что Вы ищете и существуют различия между x86 и x64 платформами, которые могут влиять на вывод. Grody детализирует здесь.
Можно распечатать stacktrace в любое время путем вызова Среды. StackTrace
string tracktrace = System.Environment.StackTrace;