2010-05-21 48 views

回答

1

泛型:向设计,看看他们是否明白type erasure的问题。

注释:问他们自己喜欢的注释是什么,以及它是如何工作(你并不需要一个详细的技术解释,但你正在寻找的东西比“魔术”更多)。

+0

一个很好的类型删除问题是哪些签名是不可能由于类型删除(例如,x(列表)和x(列表))。 – 2010-05-21 15:26:15

1

注解:有什么风险? (编译器可能陷入无限循环并阻塞构建过程)。

泛型:如何建立使用泛型一个mixin? (编写一个接受参数的泛型类,然后使用子类作为参数进行扩展)。

另外,+1型擦除。

+1

有关“编译器可能陷入无限循环”的引用作为风险注释。我认为自我参照注释明显地被阻止。 – Nate 2010-05-21 16:59:24

+0

@Nate - 我也很好奇,看看会发生什么。 – 2010-05-21 19:17:14

+0

以下两种方式之一: 1.注释处理代码无缘无故 - 例如,设想一个计算factorial的注释并获取@Fact(-1)。 2.生成代码的注释处理代码,为新一轮编译标记新代码,新代码还包含注释......我不记得确切的标志。 – 2010-05-22 18:09:08

1

这里有几个仿制药:

1)

问题:如果我有这种方法,我将如何创建T类型的新实例并将其分配给一个变量叫这个方法里面的item(假设Class<T>有一个默认的构造函数)?

public static <T> Collection<T> select(Class<T> c, String sqlStatement) { 
} 

T item = c.newInstance(); 

2)

问题:如果你想表明通用扩展一些基本的类,但你不知道是什么扩展基类的类会一直运行到运行时,你怎么能声明泛型?

:使用通配符:<? extends SomeBaseClass>

+0

1)假定默认构造函数。 – Nate 2010-05-21 16:45:20

+0

@Nate - 公平点,我更新它来反映这一点。 – dcp 2010-05-21 16:57:26

2

问:你怎么能确定一个通用的在运行时使用什么类型的对象?

答:这是不可能确定,因为类型擦除的类型。

+1

不完全如此。好的旧的超类型令牌只能被执行,因为有些类型的信息被遗漏。这个不错的规则还有一个例外,但我遗憾地忘了它。 – 2010-05-21 15:37:01

+1

那么,运行时对象的类型是通过调用'object.getClass()'获得的,而不管使用什么东西,所以你可能需要一个更仔细的措词问题。 – 2010-05-21 16:07:07

1

如果你正在寻找一个摇滚明星的Java程序员,你可以创建一个从Generics chapter in Bloch's Effective Java不少先进的问题。像同质或异形容器(从Java教程之一的鸟笼和狮子笼示例),擦除等东西。

在较不高级的人我主要寻找理解为什么会想要泛型令人惊讶的是,有多少人不理解这一点,并相信Java 2的做事方式仍然如此)以及类似的事情。

在注解,我喜欢问的是“覆盖”注释和它的好处。我还喜欢深入讨论注释的优缺点,以及何时适合使用它们 - 我不喜欢过度的元编程。这也是一个很好的机会,看看有人使用Hibernate或JUnit进行注释。

+0

有效的Java是必不可少的一本书。将看看这一章。 – 2010-05-21 15:36:00

3
  • Class Enum<E extends Enum<E>>确保什么?
  • <T> List<? extends T> x()有用的签名?
  • 注释保留策略及其原因?
  • 假设你想在不同的上下文中重用一个类,你会使用注释还是外部配置? (即注释引入依赖关系)。

哈尔德:

  • 有效的泛型类型不能与Java类型系统中表达,并会导致编译器警告的例子。
  • java编译器将会/不会引用泛型类型的例子吗? (编译器将输入错误类型的代码示例)
  • 什么泛型类型信息没有被擦除,可以从字节码中检索? (Super type tokes是一个应用程序)
  • 什么是APT(不使用反射时的用例)?
+0

托马斯,请您详细说明(或提供链接)未删除的通用类型信息(第3项难题)?这是非常有趣的... – Oak 2010-05-21 15:57:39

+1

@Oak - 增加了它。 – 2010-05-21 16:13:22

1

这里有几个我只是做了:

- [守口如瓶仿制药]请问在取消这些行会导致问题?哪些,如果有的话?为什么或者为什么不?

public class Cage<T> { ... } 
public class Animal { ... } 
public class Bear extends Animal { ... } 
// Cage<Animal> c = new Cage<Bear>(); 
// Cage<Bear> c = new Cage<Animal>(); 
// Cage<?> c = new Cage<Animal>(); 
// Cage<Animal> c = new Cage<?>(); 

- [约束]只有Animals应该进入Cages。我们如何收紧上面的类定义,以便它们反映这个新的要求?你不能实例化一个泛型类型的数组。因此,类似new List<Animal>[10]是非法的。你能想到一个场景,如果这个是合法的,你会遇到麻烦吗?

答案作为练习留给读者 - 如果你自己不明白,你就不会学习任何东西!但这里有一些提示。

  • [Cagey仿制药]:?是什么意思?你还记得术语“协变”吗?
  • [约束条件]:Java允许您限制类型参数的值。你还记得这个的语法吗?
  • [法律纠纷]:假设你可以做Object[] arr = new List<String>[]。你能写一些代码,把arrLists不应该在那里?
1

“注释擅长什么类型的东西?”和“注释不好的是什么类型的东西?”想到了。

注解擅长元编程,但作为一种可能的最佳实践,使用的代码在注释中应该仍然有效,如果将所有这些注释掉。或者不可以。

否。您的里程可能会有所不同,但您可能希望所有高级开发人员都能就此达成一致。

7

由于Java 5出来的时候,我看到几十人不明白为什么,给定一个接口I和类AB extends A你不能将其中需要I<A>I<B>。很多人认为它是反直觉的。

要测试一个人的能力,以原因约泛型的话,我会先问他们是否可能如上所述的I<B>分配给I<A>参考。如果不是,为什么不呢?如果他们弄错了,告诉他们,他们错了,并要求他们尝试填补空白,这里要说明为什么这个例子是类型非安全的,如果它可以编译:

//... 
    List<String> list = new LinkedList<String>(); 
    someMethod(list); 
    //blank 1 
} 
public void someMethod(List<Object> list) { 
    //blank 2 
} 

在这一点上应该很容易,如果他们不能构建这样一个例子,我会有点担心。一个例子是

//blank 1 
String item = list.get(0); 

//blank 2 
list.add(Integer.valueOf(5)); 
+0

现在我明白了,谢谢 – 2016-01-21 17:48:06

2
  1. 通用:

问:什么是一个HashMap和Hashtable的区别? A:散列表是同步的,散列表不是。

  • 注解:
  • 问:描述序列化Java对象与javax.xml.bind.Marshaller接口和说明。

    答:描述是这样的一个有意义的情境应该是可以接受的:

    @XmlRootElement
    class Employee {
    ...
    }

    +6

    我认为您会将泛型与Java Collections库混淆。 – 2010-05-21 15:56:41

    6

    这个测试:

    http://tests4geeks.com/test/java

    包含注释的一些问题。

    它不包含任何关于泛型的问题。但是,而不是它,还有一些其他有趣的主题,如:

    多线程,

    内存,

    算法与数据结构,

    OOP,

    +0

    我更喜欢你的解决方案。 – Guru 2013-03-15 10:11:24

    +0

    有一些问题是由非英语母语人士(或所有问题)写的。对于大多数人来说并不重要,但是对于少数人来说,这个问题无所适从 – tgkprog 2013-07-21 21:58:58