小编Man*_*DIP的帖子

为什么this.getClass给出自己的类名而不是匿名类名?

我通过在公共static void main()方法内实现接口I创建了匿名类。因此,通过Java 8的抽象方法test(),实现是从类C的imple()方法提供的。

因此,在public static void main()方法内部,打印_interface.getClass(),我得到了

package_path.Main $ $ Lambda $ 1/310656974这是绝对好的。因为它打印的是匿名类名。

另外,_interface指向堆中的匿名对象,因此我正在做_interface.test();。

因此,test()方法现在具有的第一条语句是打印类名称,

但是最终它显示的是package_path.C(告诉我C是类名)。那怎么可能?不应再次打印package_path.Main $$ Lambda $ 1/310656974吗?因为“这”意味着在测试方法内部是匿名的,对吗?

@java.lang.FunctionalInterface
interface I {
    void test();
}

class C {
    void imple() {
        System.out.println(this.getClass());
        System.out.println("Inside Implementation");
    }
}

class Main {
    public static void main(String[] args) {
        I _interface = new C()::imple;
        System.out.println(_interface.getClass());
        _interface.test();
    }
}
Run Code Online (Sandbox Code Playgroud)

java anonymous-class java-8 functional-interface

5
推荐指数
1
解决办法
83
查看次数

为什么 Java Stream.map 采用 Function<?超级 P_OUT, ? 扩展 R> 映射器作为输入而不是 Function<P_OUT, ? 扩展 R>?

为什么map将其输入作为 aFunction类型<? super P_OUT, ? extends R>而不是<P_OUT, ? extends R>

例如,当我这样做时,

List<Integer> list = new ArrayList<>();
list.stream().map(xyz -> {}); // Here xyz is always of type Integer for this instance. 
                              // Then why does it take input as "? super Integer"?
Run Code Online (Sandbox Code Playgroud)

是不是因为没有限制方法引用?这是唯一的用例吗?

java generics wildcard java-8 java-stream

5
推荐指数
1
解决办法
1052
查看次数

当我们将职责划分为不同类别时尝试理解 SRP

我试图了解 SRP 原理,但大多数软线程没有回答我遇到的这个特定查询,

用例

每当用户尝试在网站中注册/创建用户帐户时,我都会尝试向用户的电子邮件地址发送一封电子邮件来验证自己。

没有建议零售价

class UserRegistrationRequest {
    String name;
    String emailId;
}
class UserService {
    Email email;

    boolean registerUser(UserRegistrationRequest req) {
        //store req data in database
        sendVerificationEmail(req);
        return true;
    }

    //Assume UserService class also has other CRUD operation methods()    

    void sendVerificationEmail(UserRegistrationRequest req) {
        email.setToAddress(req.getEmailId());
        email.setContent("Hey User, this is your OTP + Random.newRandom(100000));
        email.send();
    }
}
Run Code Online (Sandbox Code Playgroud)

上述类“UserService”违反了 SRP 规则,因为我们将“UserService”CRUD 操作和触发验证电子邮件代码合并到 1 个类中。

因此我这样做,

含建议零售价

class UserService {
    EmailService emailService;

    boolean registerUser(UserRegistrationRequest req) {
        //store req data in database
        sendVerificationEmail(req); …
Run Code Online (Sandbox Code Playgroud)

java oop design-patterns single-responsibility-principle solid-principles

5
推荐指数
1
解决办法
385
查看次数

为什么 Java8 Stream.min() 和 max() 将比较器作为输入?

min() 函数应该计算集合中的最小元素并将数据返回给我们,这不是很明显吗?

我可以接受用户定义的对象(如 Person、Animal 等)的事实……我们必须提供比较器来计算最小元素。但是对于像 Integer、String、Double 这样普遍接受的类型,它为什么要尝试接受比较器实现。

它可能被重载的功能喜欢吗?

1.

min() => Just for types like Integer, String, Double etc..
Run Code Online (Sandbox Code Playgroud)

2.

min(Comparator c) => for types like user defined objects like Person etc...
Run Code Online (Sandbox Code Playgroud)

例如。,

List<Integer> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

list.stream().min(/我仍然可以传递一个比较器来计算最大整数数据并违反函数的基本意图,对吗? /)

java java-8 java-stream

3
推荐指数
1
解决办法
148
查看次数

为什么Java要求1.5版本需要向后兼容?

Java 1.5是与泛型一起发布的,他们希望它与早期版本向后兼容,因此Java禁止在创建原始实例时使用方法特定的泛型。

例如

class A<T> {
    <U> U myMethod(U u) {
        return u;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我做 ,

A a = new A();
Run Code Online (Sandbox Code Playgroud)

a.myMethod将要求我将Object作为输入传递,其返回类型为Object。显然,类类型参数'T'与myMethod()特定的泛型'U'不冲突。但是Java却以某种方式表示,为了处理向后兼容性,它们会删除原始实例使用的所有泛型。

别人多次问了上述问题,所有答案都只说了一次,因为与早期版本的向后兼容性Java不允许这样做。[点]。

但是,没有一个答案提供了一个实例,以防Java允许对原始实例使用方法特定的泛型,而在早期版本中可能会失败。

任何人都可以通过提供一个特定的实例(如果他们允许的话)在1.5之前的早期版本中出现问题的情况来提供帮助吗?

请不要提供其他与问题无关的,没有答案的stackoverflow问题。

java generics backwards-compatibility java1.4 java-5

1
推荐指数
1
解决办法
91
查看次数