Jam*_*mes 53 java generics class subclassing
public class MyGeneric<T, E> {}
public class Extend1<T, E> extends MyGeneric<T, E> {}
public class Extend2 extends MyGeneric<String, Object> {}
Run Code Online (Sandbox Code Playgroud)
据我所知,上例中的两个子类都是有效的.我想知道Java何时知道在实例化子类时何时定义超类中给出的类型,以及何时它们是实际的类名(即它如何知道T,E不是类名)?
附注,是否允许(即使不常见)为泛型类型使用多个字母?如果(通过计划的某些严重错误)类型与现有类冲突,例如
public class E{}
public class Foo<E>{}
Run Code Online (Sandbox Code Playgroud)
那会发生什么?
编辑:感谢您及时回答.要回答我的第一个问题,Joachim的答案是最有效的.
为了回答这一点,aioobe的答案更加清晰
Joa*_*uer 58
我们来看看这个定义:
public class Extend1<T, E> extends MyGeneric<T, E> {}
Run Code Online (Sandbox Code Playgroud)
这里T和E每个都出现两次,分为两个不同的角色
Extend1<T,E>你定义类型参数.这意味着该类型Extend1有两个(无界)类型参数T和E.这告诉Java编译器那些使用者 Extend1需要指定类型.extends MyGeneric<T,E>您使用以前定义的类型参数.如果T并E没有已知的类型参数在这里,然后T和E将是简单类型的引用,即编译器会寻找类(或接口,...)命名T和E(最有可能找不到它们).是的,类型参数遵循与Java中任何其他标识符相同的语法规则,因此您可以使用多个字母ABC甚至可能令人困惑的名称(使用称为String合法的类型参数,但非常混乱).
单字母类型参数名称只是一种非常常见的命名策略.
aio*_*obe 22
我想知道Java如何知道当子类被实例化时超级类中给出的类型何时被定义,以及当它们是实际的类名时(即它如何知道T,E不是类名)?
Java并不关心.如果你这样做......
class MyGeneric<String> extends ArrayList<String> {
String value;
}
Run Code Online (Sandbox Code Playgroud)
是否允许(即使不常见)为泛型类型使用多个字母?如果(通过计划的某些严重错误)类型与现有类冲突,例如
是的,您可以使用任何有效的Java标识符作为类型参数.
名称可能存在冲突,但Java不会将此视为错误.无论标识符是否与类名相对应,<... 之间的标识符>将始终被视为类型参数.
但它可能会让人感到困惑.这是一个例子:
class MyGeneric<String> extends java.util.ArrayList<String> {
String value;
}
class Test {
public static void main(String... args) throws Exception {
MyGeneric<Integer> obj = new MyGeneric<Integer>();
obj.value = 5;
// ^
// |
// '--- Assign an integer to what seems to be a String!
}
}
Run Code Online (Sandbox Code Playgroud)
类似的问题:
| 归档时间: |
|
| 查看次数: |
62539 次 |
| 最近记录: |