[Java] получить строку с именем класса-параметра шаблона

procenkotanya

Хочется получить строку с именем класса. Для этого хорошо подходит метод getName класса Class, например, вот так: String.class.getName возвращает java.lang.String
Однако для классов, которые являются шаблонами методов так просто не получится:

$ cat test.java
import java.lang.*;
public class test {
public<template_parameter> void test
{
System.out.println(String.class.getName;
System.out.println(template_parameter.class.getName;
}
}
$ javac test.java
test.java:7: cannot select from a type variable
System.out.println(template_parameter.class.getName;
^

Как быть?

livemix

Если ты не собираешься в метод передавать объекты типа template_parameter (или объекты, содержащие этот тип то зачем тебе параметризованный метод?
А если собираешься передавать указанные выше объекты, то вызови у них getClass.getName

procenkotanya

Надеюсь, приведённый код полностью объясняет, что я хочу.

import java.lang.*;
public class test {
public<template_parameter extends some_base> void test(some_base param)
{
try {
template_parameter.castAs(param);
} catch (ClassCastException e) {
System.out.println("param is "+param.getClass.getName+", not "+template_parameter.class.getName;
}
}
}

livemix

Итак,
 public<template_parameter extends some_base> void test(some_base param)  

сигнатура метода test показывает, что в него не передается никакого параметра типа template_parameter. Поэтому на момент начала выполнения метода точный тип параметра template_parameter просто НЕ ЗАДАН. Это может оказаться любой из наследников типа some_base. Поэтому вполне логична ругань компилятора - ведь он не будет знать ничего про этот тип даже в момент выполнения кода.

procenkotanya

Ах, да, я почему-то подумал, что test можно будет как в C++ вызвать: test<derived>(param);
Кстати, нашёл вот такое решение:

import java.lang.*;
class some_base {}
class derived extends some_base {}
class other_derived extends some_base {}
public class test {
    public<template_parameter> template_parameter test(Class<template_parameter> class_to_check, some_base param)
    {
     template_parameter t=null;
     try {
     t = class_to_check.cast(param);
     } catch (ClassCastException e) {
     System.out.println("param is "+param.getClass.getName+", not "+class_to_check.getName;
     }
     return t;
    }
    public void test2
    {
     test(derived.class, new other_derived;
    }
}

Какой Java, оказывается, прикольный язык
Оставить комментарий
Имя или ник:
Комментарий: