通用 super class 和 super class 类型的区别

Difference between generic super class and super class type

我无法理解下面两个代码片段之间的区别。谁能帮我简单解释一下?

首先,我不得不说,我有很多classes扩展了一个名为BaseEntity的超级class,那么有什么区别,优点和缺点以下片段中的哪些?

// 1
public <T extends BaseEntity> T getName(T t) {
    return t;
}

// 2
public BaseEntity getName(BaseEntity t) {
    return t;
}

1) 在你的第一个代码中你有一个 return 方法的限制应该是 BaseEntitysubclasses 并且输入参数必须是 BaseEntity 的相同子类.

2) 在你的第二个代码中你有 return 并且方法的参数应该是 BaseEntity.

subclasses

第一个片段更灵活,因为它保留了 T 的实际类型。假设你有一个子类:

class SubEntity extends BaseEntity {}

第一种情况可以这样写:

SubEntity result = getName(new SubEntity());

但是在第二种情况下你需要一个转换:

SubEntity result = (SubEntity)getName(new SubEntity());

使用这两种方法的主要区别是在第二种情况下可能需要进行转换。

假设您有:

public class MyEntity extends BaseEntity {
}

使用第一种方法你可以得到类似的东西:

MyEntity myEntity = ...
MyEntity entity = getName(myEntity);

使用第二种方法时,您必须这样写:

MyEntity entity = (MyEntity)getName(myEntity);

这是因为您在第一个方法中指定了具体类型。

令我惊讶的是,之前的答案中没有人提到这一点,但是这两种方法声明之间存在更根本的区别(这就是第二种情况需要强制转换的原因)。这种差异与您在此处提供的微不足道的方法无关,但对于执行不同于简单 return 参数的方法可能会有所不同。

您的第一个方法声明要求 return 类型与传入的参数相同类型。所以

public <T extends BaseEntity> T getName(T t) {
    return new SubEntity(); // Where SubEntity extends BaseEntity
}

编译失败而

public BaseEntity getName(BaseEntity t) {
    return new SubEntity(); // Where SubEntity extends BaseEntity
}

是完全合法的,即使传入方法的 BaseEntity 是与 SubEntity 完全不同的类型。