在这样的函数中:
下面这段代码可以正常工作:
再次提问:为什么在字符串的情况下不需要转换,而在这里需要转换?为什么需要
有没有办法从
一种方法是使用
那种情况怎么样?
这个运行良好。但是对于
为什么不能例如有一个通用接口像
或者将
现在将
或者用不同的话来说:在这里,我详细描述了解决这种
(我不希望得到这样的答案:Java现在的工作方式,即从非泛型的
<T> void foo(T obj)
obj.getClass()
的类型是Class<?>
而不是Class<? extends T>
。为什么呢?下面这段代码可以正常工作:
String foo = "";
Class<? extends String> fooClass = foo.getClass();
T#getClass()
的签名似乎返回一个 Class<? extends T>
,是吗?
如果 T
确实是一个泛型,为什么签名会不同呢?
为了解决这个问题(并更清楚地说明我在思考什么),我实现了这个函数:
@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T obj) {
return (Class<? extends T>) obj.getClass();
}
再次提问:为什么在字符串的情况下不需要转换,而在这里需要转换?为什么需要
SuppressWarnings
?从代码中不是总能清楚地知道它能够安全地执行此转换吗?有没有办法从
obj
获取Class<? extends T>
?如果有,如何获取?如果没有,为什么没有?一种方法是使用
classOf
。这样是安全的,对吗?如果始终如此安全并提供了一种真正获取Class<? extends T>
(而不是Class<?>
)的安全方式,为什么Java中没有这样的函数?还是有吗?那种情况怎么样?
<T> void bar(T[] array)
array.getClass().getComponentType()
再次返回一个 Class<?>
而不是 Class<? extends T>
。为什么呢?
我实现了这个函数:
@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T[] array) {
return (Class<? extends T>) array.getClass().getComponentType();
}
这个还能安全使用吗?
更明确地说,考虑以下演示代码:
static interface I<T> {
Class<? extends T> myClass();
}
static class A implements I<A> {
public Class<? extends A> myClass() {
return this.getClass();
}
}
static <T> void foo(I<T> obj) {
Class<? extends T> clazz = obj.myClass(); // this works
}
这个运行良好。但是对于
Object#getClass()
来说并非如此。为什么不能例如有一个通用接口像
ClassInstance<T>
,带有函数 getClass()
, 并且每个Java对象都自动实现它? 这将比将其从非泛型基类 Object
扩展出来的解决方案具有正好那些改进。或者将
Object
作为泛型类:static abstract class Object<T> {
abstract Class<? extends T> myClass();
}
static class B extends Object<B> {
public Class<? extends B> myClass() {
return this.getClass();
}
}
static <T> void bar(Object<T> obj) {
Class<? extends T> clazz = obj.myClass(); // this works
}
现在将
myClass()
视为getClass()
,并考虑编译器会自动将其添加到每个类中。这将解决很多强制转换问题。我所谈的主要问题是:为什么不这样做呢?
或者用不同的话来说:在这里,我详细描述了解决这种
classOf
函数的问题的解决方案。 为什么不这样做,即为什么原始函数不是这样的?(我不希望得到这样的答案:Java现在的工作方式,即从非泛型的
Object
扩展并定义此函数,使其不可能。我想知道为什么不能以其他方式解决它,以便它成为可能。)
Object
更改为其他内容)。但我的问题实际上不是关于如何做到这一点,而是更多地关于为什么会是这样。已经有可能(例如我展示的方式)使getClass()
返回正确的类型。那为什么不是这样设计的呢? - Albert