gpt4 book ai didi

Java:T对象; obj.getClass() 的类型是 Class 而不是 Class。为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:38 26 4
gpt4 key购买 nike

在这样的函数中:

<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();
}

问题又来了:为什么这里需要类型转换而不是 String案件?为什么是 SuppressWarnings需要吗?代码中不是总是很清楚它总是能够安全地执行此转换吗?

有什么办法可以得到 Class<? extends T>来自 obj ?如果是,如何?如果不是,为什么不呢?

一种方法是使用 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>这样的通用接口(interface)?使用函数 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()并考虑编译器会自动将其添加到每个类中。它会解决很多类型转换问题。

我要说的主要问题是:为什么不这样做呢?


或者换句话说:Here, I describe in more detail the solution of such classOf function which overcomes the problem.为什么不是这样做的,即为什么原来的功能不是这样的?

(我真的不想得到这样的答案:Java 现在的工作方式,即从定义此函数的非泛型 Object 扩展,使得这不可能。我在问为什么它不是' t 以某种不同的方式解决,因此它是可能的。)

最佳答案

基本问题是 getClass() 不返回类,因为它是在对象级别定义的。即它被简单地定义为一个扩展对象的类。他们可以像这样定义 getClass()。

Class<this> getClass() { /**/ }

而是它的

Class<?> getClass()

这意味着泛型不了解 getClass 返回的内容。

关于Java:T对象; obj.getClass() 的类型是 Class<?> 而不是 Class<?延伸 T>。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4010957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com