Tag: 泛型

为什么数组是协变的,但泛型是不变的?

来自Joshua Bloch的Effective Java, 数组在两个重要方面与泛型不同。 第一个数组是协变的。 泛型是不变的。 协变简单地意味着如果X是Y的子类型,那么X []也将是Y []的子类型。 数组是协变的因为字符串是Object So的子类型 String[] is subtype of Object[] 不变简单地意味着不管X是否是Y的子类型, List<X> will not be subType of List<Y>. 我的问题是为什么决定在Java中使数组协变? 还有其他的SO帖子,比如为什么数组是不变的,但是列表是协变的? ,但他们似乎集中在斯卡拉,我不能遵循。

你如何将一个超类型列表投给一个子类型列表?

例如,假设你有两个类: public class TestA {} public class TestB extends TestA{} 我有一个返回一个List<TestA>的方法,我想将该列表中的所有对象都转换为TestB以便最终得到一个List<TestB> 。

为什么这个例子没有编译,又如何(合作,对立和in)方差工作?

继这个问题之后 ,有人可以在Scala中解释以下内容: class Slot[+T] (var some: T) { // DOES NOT COMPILE // "COVARIANT parameter in CONTRAVARIANT position" } 我理解类型声明中的+T和T之间的区别(如果我使用T则编译它)。 但是如何在没有参数化的情况下写一个类型参数协变的类呢? 我怎样才能确保以下只能创建一个T的实例? class Slot[+T] (var some: Object){ def get() = { some.asInstanceOf[T] } } 编辑 – 现在把它归结为以下内容: abstract class _Slot[+T, V <: T] (var some: V) { def getT() = { some } } 这一切都很好,但我现在有两个类型参数,我只想要一个。 […]

如何创建一个通用数组?

我不明白泛型和数组之间的联系。 我可以使用泛型类型创建数组引用: private E[] elements; //GOOD 但是不能用泛型类型创建数组对象: elements = new E[10]; //ERROR 但它的作品: elements = (E[]) new Object[10]; //GOOD

方法与另一种类型的方法具有相同的擦除

为什么在同一个班上有这两种方法是不合法的? class Test{ void add(Set<Integer> ii){} void add(Set<String> ss){} } 我收到compilation error 方法add(Set)与Test类型中的另一个方法具有相同的擦除add(Set)。 而我可以解决它,我想知道为什么javac不喜欢这个。 我可以看到,在很多情况下,这两种方法的逻辑非常相似,可以用一个单一的方法来代替 public void add(Set<?> set){} 方法,但这并不总是如此。 如果你想要有两个constructors来接受这些参数,那么这是非常烦人的,因为那样你就不能只改变一个constructors的名字。

用反射获取Java中的泛型参数的类型

是否有可能获得一个通用参数的类型? 一个例子: public final class Voodoo { public static void chill(List<?> aListWithTypeSpiderMan) { // Here I'd like to get the Class-Object 'SpiderMan' Class typeOfTheList = ???; } public static void main(String… args) { chill(new ArrayList<SpiderMan>()); } }

列表<T>或IList <T>

任何人都可以向我解释为什么我想在C#中使用列表中的IList? 相关问题: 为什么公开List<T>被认为是不好的