假设您有:
public interface A {}
public class B implements A {}
public class C {
void foo (List<A>) {}
}
public class Test {
//Declaration one
List<A> x = new List<A>();
//Declaration two
List<A> x = new List<B>();
B b = new B();
x.add(b);
new C().foo(x);
}
现在显然声明一是执行此操作的正确方法,并且在声明二上收到编译错误。我想知道为什么Java选择以这种特定方式强制执行类型安全。如果“猫”列表仍然是“动物”列表,那么为什么期望有动物列表的方法却拒绝接收一堆猫呢?
好奇心比什么都重要-并有机会更好地完善我的知识。
干杯,戴夫。
Java泛型不是 协变的 。如果可以这样做:
ArrayList<Animal> x = new ArrayList<Cat>();
那么您将能够执行以下操作:
x.add(new Dog());
这违反了ArrayList<Cat>
只能容纳Cat
对象(或子类对象)的概念。
阅读本文以获得更多详细信息:
Java理论与实践:泛型陷阱
。
问题内容: 要在中使用泛型类型,我们需要使用(无法获得泛型,其中T是泛型类“ ) 假设我有课 还有一些包装类 因此,如果我尝试执行此类操作,则一切正常。 但是当我尝试创建上述方法的通用变体时… …并像这样调用此方法… …而不是得到对象,我得到了对象。 我怎么解决这个问题?它是RestTemplate错误吗? 我了解这个概念。不幸的是我是在这里新注册的,所以我无法评论他的答案,所以在这里写下。林不知
问题内容: 是否可以在方法的返回参数中使用通用通配符类型,这是否可行? 换句话说,确实可以像下面这样声明一个接口: 另外,可以说通用通配符类型仅在方法的 参数声明 时才有意义吗? 问题答案: 使用通配符类型(例如在方法正式参数中)的主要好处是为用户提供了灵活性,使其可以传递任何类型的,或任何实现Collection的东西(假设collection声明为)。您通常会发现自己在形式参数中使用通配符类型
问题内容: 如何使用反射在Java中创建通用的参数化类? 我有 我需要一个实例。 我尝试了 但找不到可以让我获取适当类型的实例的语法,例如说 那么,我该怎么做呢? 问题答案: Java使用基于擦除的仿制药(即,类型参数是在运行时,例如擦除,并且被视为在运行时是同一类型)。由于反射本质上是运行时功能,因此根本不使用或不涉及类型参数。 换句话说,当您使用反射时,您只能实例化原始类型(,不能实例化)
问题内容: 我正在为我的Java应用程序设计一个简单的数据访问对象。我有一些类(记录),它们代表像和中的表格中的一行。 我想有一种方法来获取特定类型的所有记录。 就目前而言,我是这样的: 但是我想有一个像这样的多态方法(错误): 使用示例: 如何用Java做到这一点? 问题答案: 既然您说不想在不同的类中使用数据访问方法(在Anish的回答中),所以我想为什么不尝试这样的方法。 编辑: 我想再添加
问题内容: 我对PHP函数的默认值感到困惑。说我有一个这样的功能: 如果我想为$ x使用默认参数并为$ y设置不同的参数怎么办? 我一直在尝试不同的方法,但我变得更加困惑。例如,我尝试了以下两种方法: 但是这两个都不会为$ x产生适当的默认参数。我也试图通过变量名来设置它。 我完全希望这样的事情能奏效。但这根本不符合我的预期。似乎不管我做什么,每次调用该函数时,无论如何我都必须最终键入默认参数。而
是否可以使用等待与参数?例如: 即使是这样,似乎也不是最好的主意。以前有人这样做过吗?