我刚刚了解了这种美观的语法
Collections.<String>emptyList()
List
用可能是类型的元素来清空String
。Java的源代码如下所示:
public static final List EMPTY_LIST = new EmptyList<Object>();
:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
现在,如果我以这种方式编写了一个泛型类型不出现在参数列表中的方法,那么有什么方法可以访问成为的实际类T
呢?
我的意思是,到目前为止,我编码同一件事的方法是
private <T> T get(String key, Class<T> clazz) {
// here I can do whatever I want with clazz, e.g.:
return clazz.cast(value);
}
如果删除了clazz
-parameter,我将无法执行cast()
。显然我可以
return (T) value;
但这给了我通常的警告Type safety: Unchecked cast from Object to T
。好的,@SuppressWarnings("unchecked")
在这里有帮助,但是实际上我想对方法的预期返回类型做些事情。如果我添加局部变量
T retValue;
我不得不用一些东西来初始化它,这null
无济于事。在我分配之后
@SuppressWarnings("unchecked")
T retValue = (T) value;
我能做到,例如
retValue.getClass().getName()
但是如果强制转换失败,我将无从得知任何信息T
。
由于Java(或至少我的Java 6)在运行时不再具有通用信息,因此我目前无法想到一种方法。有办法吗?还是我必须在这里坚持我的“旧”方法?
请注意,我列出的示例非常简单,没有多大意义。 我想在这里做更复杂的事情,但这超出了范围。
如果要在运行时使用通用类型,则需要将其作为字段或为特定类型的组合创建类型的子类。
例如
List<String> list = new ArrayList<String>() {}; // creates a generic sub-type
final Class type = (Class) ((ParameterizedType) list.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
版画
class java.lang.String
问题内容: 该问题的可接受答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数并从中调用方法。 然后创建的新实例,并传递参数。 如果新类的泛型类型参数不是某个已知类,但它本身是泛型类型参数,该怎么办?假设我还有其他班级,我想从该班级内部创建一个新实例。然后,如果尝试传递,则会收到以下编译器错误: 有没有办法解决? 对我来说触发错误的代码是: 发生错误,是因为我不会写。还有其他传递相同信息的方
这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?
如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
我有一个类
问题内容: 我有一个抽象类: 我需要充实的孩子-每个孩子都有自己的孩子 我只找到一种解决方案,但需要编译器参数 这是最好的解决方案吗?没有我们可以做同样的事情吗? 问题答案: 实现此目的的类型安全但很简单的方法是传递令牌“编译器可以看到它的位置”: 如果您执行的是未经检查的强制转换,但您“知道自己在做什么”,并且希望编译器停止抱怨,则正确的方法是将非类型安全但您知道它们的工作位本地化。使用: (我