这是这个问题的延伸,可能甚至可能是其他一些问题的重复(如果是,请原谅我).我在MSDN上看到泛型通常与集合一起使用
对于泛型类最常见的用途是一个像链表,哈希表,栈,队列,树的集合等在那里,如添加和删除收集的项目操作在几乎相同的方式数据彼此的类型进行不分存储.
我见过的例子也证实了上述说法.
有人可以在不涉及任何集合的现实场景中有效地使用泛型吗?
小心翼翼地,我正在考虑制作一个不涉及收藏的例子
public class Animal<T>
{
public void Speak()
{
Console.WriteLine("I am an Animal and my type is " + typeof(T).ToString());
}
public void Eat()
{
//Eat food
}
}
public class Dog
{
public void WhoAmI()
{
Console.WriteLine(this.GetType().ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
和"动物类型的狗"将是
Animal<Dog> magic = new Animal<Dog>();
完全有可能Dog继承自Animal(假设非泛型版本Animal)Dog:Animal因此Dog 是一个 Animal
我想的另一个例子是 BankAccount.它可以是BankAccount<Checking>,BankAccount<Savings>.这很可能是Checking:BankAccount和Savings:BankAccount.
是否有任何最佳实践来确定我们是否应该使用泛型或继承?
我有几个看起来像这样的方法:
public void do(A a, B b);
public void do(A A, C c);
public void do(D d, A a);
public void do(D d, E e, X x, F f, Optional<A> a);
Run Code Online (Sandbox Code Playgroud)
等等,有大约几十种方法基本相同,但参数不同.
现在我想到使用一个构建器模式,它允许我使用这样的功能:
withA(a).withB(b).withX(x).do();
Run Code Online (Sandbox Code Playgroud)
但问题是,有几种方法中的一种抛出异常.如果我使用构建器模式,则do()必须抛出此异常,因此所有客户端都必须处理它.在我看来,这听起来像一个问题.
我的问题:
为什么在方法reference(::)中使用实例方法时,NullPointerException如果我们将Object实例设置为null ,则不抛出?
public class MethodReferenceTest {
public static void main(String...strings){
PredicateSample predicateSample = new PredicateSample();
Predicate<String> predicate = predicateSample::isNotEmpty;
// NullpointerException ???
predicateSample = null;
Arrays.asList("a","b","c",null)
.stream()
.filter(predicate)
.forEach(System.out::println);
}
static class PredicateSample{
public boolean isNotEmpty(String s){
return ((s!=null) && (!s.isEmpty()));
}
}
}
Run Code Online (Sandbox Code Playgroud)
predicateSample在构造Predicate之后似乎没有调用?