英文:
How to use Contravariance in Java with Classes
问题
I am learning Java variance.
我正在学习Java的变异性。
I am getting the Covariant to work but not Contravariance where I can accept a super type.
协变性可以工作,但逆变性无法工作,无法接受超类型。
I have a simple class hierarchy for this:
我有一个简单的类层次结构:
Animal,
Cat,
Lion
动物,猫,狮子
Then I have two classes as Generic holders:
然后我有两个作为泛型持有者的类:
CovariantAnimalHolder
ContraVariantHolder
协变动物持有者,逆变持有者
The Covariant works fine but Contravariance isnt working.
协变性可以正常工作,但逆变性不起作用。
Here is the code:
以下是代码:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public Animal() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Cat extends Animal {
private boolean isWild;
public Cat(boolean isWild) {
this.isWild = isWild;
}
public Cat(){
}
public boolean isWild() {
return isWild;
}
public void setWild(boolean wild) {
isWild = wild;
}
}
public class Lion extends Cat{
private boolean isExtinct;
public Lion (boolean isExtinct) {
this.isExtinct = isExtinct;
}
public Lion () {
}
public boolean isExtinct() {
return isExtinct;
}
public void setExtinct(boolean extinct) {
isExtinct = extinct;
}
}
public class CovariantAnimalHolder<T extends Cat> {
private T animalHolder;
public T getAnimalHolder() {
return animalHolder;
}
public void setAnimalHolder(T animalHolder) {
this.animalHolder = animalHolder;
}
}
public class VarianceMain {
public static void main(String[] args) {
//This works
CovariantAnimalHolder<Lion> lionCovariantAnimalHolder = new CovariantAnimalHolder<Lion>();
//This works:
CovariantAnimalHolder<Cat> catCovariantAnimalHolder = new CovariantAnimalHolder<>();
//This should not work, Perfect!
//CovariantAnimalHolder<Animal> animalCovariantAnimalHolder = new CovariantAnimalHolder<Animal>();
}
}
But when I create the ContraVariant holder I am getting some basic errors which I can't understand:
但是当我创建逆变持有者时,我遇到了一些基本错误,我无法理解:
public class ContravariantAnimalHolder<? super Cat>{
private T animalHolder;
}
Error:
错误:
英文:
I am learning Java variance.
I am getting the Covariant to work but not Contravariance where I can accept a super type.
I have a simple class hierarchy for this:
Animal,
Cat,
Lion
Then I have two classes as Generic holders:
CovariantAnimalHolder
ContraVariantHolder
The Covariant works fine but Contravariance isnt working.
Here is the code:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public Animal() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Cat extends Animal {
private boolean isWild;
public Cat(boolean isWild) {
this.isWild = isWild;
}
public Cat(){
}
public boolean isWild() {
return isWild;
}
public void setWild(boolean wild) {
isWild = wild;
}
}
public class Lion extends Cat{
private boolean isExtinct;
public Lion (boolean isExtinct) {
this.isExtinct = isExtinct;
}
public Lion () {
}
public boolean isExtinct() {
return isExtinct;
}
public void setExtinct(boolean extinct) {
isExtinct = extinct;
}
}
Animal Holders:
public class CovariantAnimalHolder<T extends Cat> {
private T animalHolder;
public T getAnimalHolder() {
return animalHolder;
}
public void setAnimalHolder(T animalHolder) {
this.animalHolder = animalHolder;
}
}
Main program:
So far great
public class VarianceMain {
public static void main(String[] args) {
//This works
CovariantAnimalHolder<Lion> lionCovariantAnimalHolder = new CovariantAnimalHolder<Lion>();
//This works:
CovariantAnimalHolder<Cat> catCovariantAnimalHolder = new CovariantAnimalHolder<>();
//This should not work, Perfect!
//CovariantAnimalHolder<Animal> animalCovariantAnimalHolder = new CovariantAnimalHolder<Animal>();
}
}
But when I create the ContraVariant holder I am getting some basic errors which I can't understand:
public class ContravariantAnimalHolder<T super Cat>{
private T animalHolder;
}
Error:
答案1
得分: 0
在Java中,无法像在其他语言中那样将泛型类型定义为协变或逆变。例如,在Scala中可以这样做。
在Java中,您定义的是具有上界的泛型类型,这会限制您在处理类型时只能使用 extends
,而不能在泛型类型中使用 super
,这也是您不能在 ContravariantAnimalHolder
类中使用它的原因。
不过,您可以定义具有下界通配符的方法,这根据您的需求可能适用于逆变。
英文:
In Java, you cannot define a generic type as a covariant or contravariant, as you can in other languages, for example, in scala
Instead, in java, what you define are generic types with Upper bounds which limit you to the use of extends
when it comes to types, and you cannot use super
with generic types, reason you cannot use it in your ContravariantAnimalHolder
class.
You can, however define methods with lower bounded wildcards, which, depending on what you need may fit your needs for contravariant
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论