小编Dav*_*rad的帖子

是'Box <Cat>``Box <?的子类型?扩展动物>`?

Java代码:

class Animal {}
class Cat extends Animal {}
class Box<T> {}

public class Test {
    public void hello(Box<? extends Animal> box) {}
}


Box<Animal> box1 = new Box<Animal>();
Box<Cat> box2 = new Box<Cat>();
new Test().hello(box1);
new Test().hello(box2);
Run Code Online (Sandbox Code Playgroud)

Liskov替换原则,因为box2类型Box<Cat>可以在需要类型的地方使用Box<? extends Animal>,我可以说:

Box<Cat> is subtype of Box<? extends Animal>

其实:我不是,如果甚至不确定Box<? extends Animal>? extends Animal有型

java generics type-systems

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

获取Java注释处理器中的数组类型

我正在写一个注释处理器.我怎样才能获得数组的类型?

@MyAnnotation
int[] iArray;


@MyAnnotation
boolean[] bArray;


@MyAnnotation
FooClass[] fooArray;
Run Code Online (Sandbox Code Playgroud)

据我所知,我可以检查它是否是这样的数组:

if (element.asType().getKind() == TypeKind.ARRAY) {
   // it's an array
   // How to check if its an array of boolean or an array integer, etc.?
}
Run Code Online (Sandbox Code Playgroud)

我如何获得数组的类型?

基本上我迭代所有注释的元素@MyAnnotation,我将根据数组的类型对数组做一些特殊的事情,类似于:

for (Element element : enviroment.getElementsAnnotatedWith(MyAnnotation.class)) {
    if (element.getKind() != ElementKind.FIELD)
        continue;

    if (element.asType().getKind() == TypeKind.ARRAY) {
        // it's an array
        // How to distinguish between array of boolean or an array integer, etc.?
    }
}
Run Code Online (Sandbox Code Playgroud)

java annotations annotation-processing

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

尝试在泛型类中应用lambda表达式时输入不匹配编译错误

在下面的Java 8代码示例中,所有方法都是等效的,除了foo3()之外的所有方法都是编译的.

  1. 为什么foo2()编译但foo3()产生编译错误(详见代码注释)?
  2. 为什么javac不允许在foo3中从Object到T的未经检查的强制转换,但是允许在foo4()中从Function <Object,Object>到Function <T,T>的未经检查的强制转换?
  3. 在编译的4种方法中,哪一种最好?

我怀疑这里涉及的Java编译时泛型有一些更好的点,但它们对我来说似乎并不清楚,而且远非显而易见.

import java.util.function.Function;

public class LambdaTest<T> {

  public T foo1(T t) {
    Function<T, T> myIdentity = r -> r;
    return myIdentity.apply(t);
  }

  public T foo2(T t) {
    Function<T, T> identity = Function.identity();
    return identity.apply(t);
  }

  public T foo3(T t) {
    /*  XXX Compile error!
     *  java.lang.Error: Unresolved compilation problem:
     *  Type mismatch: cannot convert from Object to T
     */
    return Function.identity().apply(t);
  }

  @SuppressWarnings("unchecked")
  public T foo4(T t) {
    // unchecked conversion from Function<Object, …
Run Code Online (Sandbox Code Playgroud)

java generics java-8

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

如何使用单个参数传递Java 8 lambda

我想简单地传递一个lambda(代码块)并在需要时执行它.如何executeLambda(...)在下面的代码中实现该方法(以及方法签名是什么):

public static void main(String[] args)
{
    String value = "Hello World";
    executeLambda(value -> print(value));
}

public static void print(String value)
{
    System.out.println(value);
}

public static void executeLambda(lambda)
{
    someCode();
    lamda.executeLambdaCode();
    someMoreCode();
}
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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

从函数定义Haskell中推断函数类型

所以我正在对Haskell进行测试,一个问题说:

让功能成为

lolo g x = ys
      where ys = [x] ++ filter (curry g x) ys
Run Code Online (Sandbox Code Playgroud)

然后确定名为lolo的函数的类型.选项是:

a) (a,b) -> Bool -> b -> [(a,b)]
b) (b -> b -> b) -> Bool -> [b]
c) ((b,b) -> Bool) -> b -> [b]
d) (a -> b -> Bool) -> b -> [c]
Run Code Online (Sandbox Code Playgroud)

有人可以解释它是哪一个,为什么?我真的很困惑这个......我不明白的是:

1)咖喱功能只适用于功能吗?不是可能是元组的数据类型?那么你可以推断出g在这种情况下是一个函数吗?如果g和x都是函数怎么办?是否有可能使用咖喱与第n个参数?我只看到咖喱与1参数一起使用.

2)我不太了解的另一件事是ys定义中的递归.所以ys是由ys定义的,但是在这种情况下我没有看到基本情况.它会永远结束吗?也许是过滤函数使递归结束.

3)还在咖喱gx =咖喱(gx)对吧?(这是关于功能应用优先级的问题)

非常感谢

haskell types function filter currying

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

使用Java pack()方法

我不能使pack()方法工作.我尝试了几件事.我的代码目前看起来像这样:

第1类:

public static void main( String[] args )
    {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run()
        {
         JavaGui mygui = new JavaGui();
   //       mygui.setSize(1154, 753);
            mygui.setVisible(true);
            mygui.pack();
Run Code Online (Sandbox Code Playgroud)

第2类:

public class JavaGui extends javax.swing.JFrame 
    {
    public JavaGui()
        {
        getContentPane().setLayout(null);
        ..
        getContentPane().add(panelLeft);
        ...
        getContentPane().add(panelRight);
Run Code Online (Sandbox Code Playgroud)

我尝试将pack方法放在任何地方,但它不能用这种方式添加gui元素.有什么建议吗?我也尝试将所有内容添加到JFrame而不是getContentPane(),但我也无法做到这一点.

java swing layout-manager pack

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

使用Java 8动态创建具有组合键的映射

我想创建一个类似下面的地图 - >

Map<Pair<MyClass.a, MyClass.b>, MyClass>>.
Run Code Online (Sandbox Code Playgroud)

我有一个对象列表 - >

List<MyClass>
Run Code Online (Sandbox Code Playgroud)

这里的Pair是一个类,已经在我的项目中,所以我想使用它.

我需要帮助从Java 8流创建它.

我试过::

ls.stream().collect(Collectors.toMap(new Pair(MyClass.a, MyClass.b), MyClass));
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误.我是Java 8的新手并且正在努力学习它.

添加示例:

class Person {
   String name ;
   int age ;
   // Some other variables
}
Run Code Online (Sandbox Code Playgroud)

我有一份清单List<Person>.

在我的要求中,我需要一个键= {name,age},使用对类.

class Pair<T,U> {     
    Pair(T t, U u) {
        this.t = t
        this.u = u
    }

    // Overridden hashCode && equals methods
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个类似的地图 Map<Pair<String, Int>, Person>

我收到一个编译器错误,说"不是一个功能接口".

我相信必须通过java 8流和收集方式.

java-8

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

Spring Boot 2.4 及更高版本的 Mapstruct 和 Lombok 意外结果此版本有任何解决方法或问题吗?

我正在使用高于 2.2.5 和 Java 15、lombok、Mapstruct 的最新版本的 Spring boot 来映射一些 pojo。

使用spring boot 2.2.5 版时,我得到了预期的结果:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-01-02T21:59:24+0100",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 15.0.1 (Oracle Corporation)"
)
@Component
public class ProduitMapperImpl implements ProduitMapper {

    @Override
    public ProduitDtoResponse produitToProduitDtoResponse(Produit produit) {
        if ( produit == null ) {
            return null;
        }

    ProduitDtoResponseBuilder produitDtoResponse = ProduitDtoResponse.builder();

    produitDtoResponse.id( produit.getId() );
    produitDtoResponse.nom( produit.getNom() );
    produitDtoResponse.prix( produit.getPrix() );

    return produitDtoResponse.build();
}

@Override
public Produit produitToProduitDtoResponse(ProduitDtoResponse produitDto) { …
Run Code Online (Sandbox Code Playgroud)

maven lombok spring-boot mapstruct java-15

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

Java - 如何通过反射检查数组长度(类中的字段)

我有以下课程:

public class GeneralClass
{
    public int x;
    public int[] arr = new int[3];
}
Run Code Online (Sandbox Code Playgroud)

以下逻辑:

public void loadClass(Class cls) {          
    Field[] fields = cls.getDeclaredFields();
    for (Field field : fields) {            
            if (field.getType().isArray()) {
                // How can I print the array length ?
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么知道数组的大小(长度)是多少?

java reflection

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

java中可以有从0到255的字节吗?

我有系统(在c#中)来控制用户访问。对于特定情况,
我需要在java中具有相同的访问控制器。
该控制器具有密码算法(rijndael)。我的问题是这个算法使用字节数组(byte[]);这个字节类型在c#中是0 to 255,在java中是-128 to 127。这种差异会产生不同的结果。

如何使这两个代码使用相同的字节数组

PS:我无法更改c#代码;如果可以的话,我会使用 sbyte 而不是 byte。

c# java primitive-types

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

理解Haskell中的let-expression

我是Haskell的新手,目前正在研究它进行考试.我一直在从learnyouahaskell学习它.我不理解组函数中的以下let-expression.

splitWhen :: (a -> Bool) -> [a] -> ([a],[a])    
splitWhen p xs = (takeWhile (not . p) xs, dropWhile (not . p) xs)

group :: (Eq a) => [a] -> [[a]]
group [] = []
group (x:xs) = let (group1, rest) = splitWhen (/=x) xs
                   in (x:group1) : group rest
Run Code Online (Sandbox Code Playgroud)

我知道什么是splitWhen: splitWhen even [1,2,3] => ([1],[2,3])

我知道功能组产生如下:

group [1,1,2,1,3,3,3] => [[1,1],[2],[1],[3,3,3]]
Run Code Online (Sandbox Code Playgroud)

我不明白它是如何工作的.有人可以向我解释一下吗?谢谢.

haskell

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

Java:拆分文本

我需要拆分文本(String),文本就像这样:

[title],[description blablablablablabla]
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我需要在String []中存储括号之间的2个文本,用","分隔.

java brackets

-8
推荐指数
1
解决办法
1490
查看次数