Java类构造函数中尖括号的用途是什么?

问题描述:

我想要方法public void x(List<Class<some expression>> m)抛出一个错误,如果你试图通过用一些表达式替换“some expression”来扩展class A{}的类。Java类构造函数中尖括号的用途是什么?

当我使用通配符或不包含它时,我总是会遇到一个令人讨厌的警告,所以我想了解为什么Class应该有一个维度,即使我完全没有使用该维度。

+0

请贴全码 – Biswajit 2013-03-13 18:10:57

+1

你应该重新阅读[泛型的Java教程](http://docs.oracle.com/javase/tutorial/java/generics/)和[Angelika Langer的常见问题](http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html ) - 我很肯定他们会继续这样做。然后用你想要工作或不工作的代码的例子来提出一个更具体的问题。 – millimoose 2013-03-13 18:13:56

+0

即完整代码... – Zackkenyon 2013-03-13 18:17:28

我并不完全明白你想要做什么。其实,这种方法的签名:如果您传递对象,它的类的List不延长YourClass

public void x(List<? extends YourClass> m) 

不会编译(姑且称之为如此,而不是A)。

如果你想让你的x方法得到一个Class对象列表作为参数,那是另一个问题。你确定你不愿意通过延伸YourClass的类的对象List吗?如果是这样,该方法签名应该可以工作。

编辑:既然你说你想传递的类的列表,那么这应该工作:

public void x(List<Class<? extends YourClass>> m) 

测试是这样的:

import java.util.*; 

class YourClass {} 
class YourClassEx extends YourClass {} 

public class Test { 

    public static void x(List<Class<? extends YourClass>> m) { 
     // stuff... 
    } 

    public static void main(String[] argv) { 

     List<Class<? extends YourClass>> list = new ArrayList<>(); 
     list.add(YourClass.class); 
     list.add(YourClassEx.class); 
     x(list); // compiles fine until here 

     list.add(String.class); // doesn't compile 
     x(new ArrayList<Class>()); // doesn't compile, either 

    } 
} 
+0

正如我在问题中所说的,显然我认为,x需要一个类对象列表。 – Zackkenyon 2013-03-13 18:18:38

+0

我更新了我的答案。 – gd1 2013-03-13 18:29:22